17

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

任何线索或替代方法?

提前致谢

4

3 回答 3

16

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

# 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 
于 2012-10-28T05:39:56.647 回答
13

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

我们关心的代码位是这个模板标签——这似乎会覆盖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)

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

于 2012-10-27T21:24:03.057 回答
5

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

input[name="_addanother"],input[name="_continue"],input[name="_saveasnew"]{
    display: none;
}
于 2015-04-02T03:37:32.417 回答