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

新手上路,请多包涵

我在 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 中删除

任何线索或替代方法?

提前致谢

原文由 Manuel Alvarez 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 968
2 个回答

除了它(有点笨拙)的黑客风格之外,您还可以直接覆盖模板标签。通常更推荐覆盖模板。

 # 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

原文由 okm 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

我们关心的代码位是 这个模板 标签——这似乎覆盖了 show_save_and_add_anothershow_save_and_continue 无论你将它设置成什么。它还创建了一个全新的上下文并仅复制某些值(不清楚这样做的理由是什么),因此您必须修改它才能获得所需的内容。

所以:

  1. 创建一个 templatetag 来复制默认标签的功能,通过重用现有标签(参见 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)

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

原文由 Tom 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题