在Django admin中,如何在模型管理员上隐藏"保存并继续"和"保存并添加另一个"按钮?

Man*_*rez 16 python django django-templates django-admin

我有一个Django管理员模型的工作流程,与用户的工作流程非常相似.首先,我有一个带有基本字段的表单,然后是带有其余数据的第二个表单.

它与auth.user的工作流程相同

我需要删除"保存并继续"和"保存并添加另一个"按钮,以防止用户破坏工作流程.

我试图将其添加为extra_context

extra_context = {
  'show_save_and_add_another': False,
  'show_save_and_continue': False
}
Run Code Online (Sandbox Code Playgroud)

并通过ModelAdmin.add_view或ModelAdmin.change_view传递它,但它不起作用.

这仅适用于一个型号,因此我不想从submit_line.html中删除

任何线索或替代方式?

提前致谢

okm*_*okm 14

Beside its (a bit awkward) hacking style, you could aslo override the template tag directly. Normally overriding template is more recommended.

# put this in some app such as customize/templatetags/admin_modify.py and place the app
# before the 'django.contrib.admin' in the INSTALLED_APPS in settings

from django.contrib.admin.templatetags.admin_modify import *
from django.contrib.admin.templatetags.admin_modify import submit_row as original_submit_row
# or 
# original_submit_row = submit_row

@register.inclusion_tag('admin/submit_line.html', takes_context=True)
def submit_row(context):
    ctx = original_submit_row(context)
    ctx.update({
        'show_save_and_add_another': context.get('show_save_and_add_another', ctx['show_save_and_add_another']),
        'show_save_and_continue': context.get('show_save_and_continue', ctx['show_save_and_continue'])
        })                                                                  
    return ctx 
Run Code Online (Sandbox Code Playgroud)

  • 我认为这实际上是最好的方法.首先,我试着在`#中把它放在一些应用程序中解释,例如customize/templatetags/admin_modify.py ...`但是它没有用.然后,我将这段代码放在admin.py文件的开头,它完美无缺. (2认同)
  • @ManuelAlvarez很好.也许你的`customize/templatetags /`缺少`__init __.py`,因此不是一个包而被忽略了.我不太确定你的`admin.py`解决方案是否适用于所有情况,我们会看到:) (2认同)

Tom*_*Tom 12

据我所知,这是不可能的"开箱即用"选项,但这就​​是我要做你想做的事情.

我们关心的代码是这个模板标签 - 这似乎是覆盖show_save_and_add_another,show_save_and_continue无论你设置了什么.它还创建了一个全新的上下文,并且只复制了某些值(不清楚这是什么理由),所以你必须修改它以获得你需要的东西.

所以:

  1. 创建一个复制默认标记功能的模板标签,方法是重用现有标签(参见okm的示例)或完全复制它.这里唯一的变化是它应该保留show_save_and_add_another原始上下文而不覆盖它,或者通过你自己的really_hide_save_and_add_another_damnit上下文变量.
  2. 替换change_form.html以包含并使用您自己的模板标签,替换submit_row为它.
  3. 如果您已经选择使用额外的上下文变量,使用另一个条件语句包装按钮,请更新change_form.html.

然后,无论你选择了什么选项,都要用类似的东西更新你的ModelAdmin(基于这个来自Django文档):

class MyModelAdmin(admin.ModelAdmin):
    # ...
    def change_view(self, request, object_id, form_url='', extra_context=None):
        extra_context = extra_context or {}
        extra_context['show_save_and_add_another'] = False
        # or
        extra_context['really_hide_save_and_add_another_damnit'] = True
        return super(MyModelAdmin, self).change_view(request, object_id,
            form_url, extra_context=extra_context)
Run Code Online (Sandbox Code Playgroud)

更新:原始响应没有考虑到submit_row没有传递任何整个原始上下文.


Abh*_*rma 5

一种非常不同的方法可以在/static/admin/css/base.css中添加以下内容

input[name="_addanother"],input[name="_continue"],input[name="_saveasnew"]{
    display: none;
}
Run Code Online (Sandbox Code Playgroud)