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

时间:2012-10-27 15:00:05

标签: python django django-templates django-admin

我有一个Django管理员模型的工作流程,非常类似于用户'流程。首先,我有一个包含基本字段的表单,然后是包含其余数据的第二个表单。

它与auth.user

的工作流程相同

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

我尝试将其添加为extra_context

extra_context = {
  'show_save_and_add_another': False,
  'show_save_and_continue': False
}

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

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

任何线索或替代方式?

提前致谢

3 个答案:

答案 0 :(得分:14)

除了它(有点尴尬)的黑客风格,你还应该直接覆盖模板标签。 通常更推荐覆盖模板。

# 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 

答案 1 :(得分:11)

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

我们关注的代码是this templatetag - 无论您将其设置为什么,这似乎都会覆盖show_save_and_add_anothershow_save_and_continue。它还创建了一个全新的上下文,并且只复制了某些值(不清楚这是什么理由),所以你必须修改它才能得到你需要的东西。

所以:

  1. 创建一个模板标签,通过重用现有标签(请参阅okm's example)或完全复制,复制默认标签的功能。这里唯一的变化是它应该保留原始上下文中的show_save_and_add_another而不覆盖它,或者通过您自己的really_hide_save_and_add_another_damnit上下文变量。
  2. 将change_form.html替换为包含并使用您自己的模板标签,将submit_row替换为它。
  3. 如果您已选择使用额外的上下文变量,请使用其他条件语句包装按钮,请更新change_form.html。
  4. 然后,无论您选择哪种方式,都可以使用(基于this from the Django docs)更新您的ModelAdmin:

    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)
    

    已更新:原始回复未考虑到submit_row未传递任何整个原始上下文。

答案 2 :(得分:4)

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

input[name="_addanother"],input[name="_continue"],input[name="_saveasnew"]{
    display: none;
}