在django自定义模型管理添加页面处理自定义提交按钮的正确方法

时间:2015-06-10 07:18:55

标签: python django django-admin

我想在submit_line.html添加一个与提交完全相同的额外按钮,但是在向服务器发送帖子请求时会将某些字段设置为其他内容。

假设我有一个博客作为模型,我想添加“另存为草稿”作为按钮。

我的submit_line.html看起来像这样:

{% load i18n admin_urls %}
<div class="submit-row">
{% if show_save %}<input type="submit" value="{% trans 'Save' %}" class="default" name="_save" />{% endif %}

{% if show_save_as_draft %}<input type="submit" value="save_as_draft" class="default" name="_save" />{% endif %}


{% if show_delete_link %}
    {% url opts|admin_urlname:'delete' original.pk|admin_urlquote as delete_url %}
    <p class="deletelink-box"><a href="{% add_preserved_filters delete_url %}" class="deletelink">{% trans "Delete" %}</a></p>
{% endif %}
{% if show_save_as_new %}<input type="submit" value="{% trans 'Save as new' %}" name="_saveasnew" />{% endif %}
{% if show_save_and_add_another %}<input type="submit" value="{% trans 'Save and add another' %}" name="_addanother" />{% endif %}
{% if show_save_and_continue %}<input type="submit" value="{% trans 'Save and continue editing' %}" name="_continue" />{% endif %}
</div>

现在我不明白它是如何提出这个请求的,所以我无法修改它,所以请帮我解决这个问题。

1 个答案:

答案 0 :(得分:5)

首先,为您的按钮添加一个唯一的name

{% if show_save_as_draft %}
    <input type="submit" 
           value="{% trans 'Save as draft' %}" 
           class="default" 
           name="_save_as_draft" />
{% endif %}

然后,在ModelAdmin中,您可以覆盖save_model()方法:

class MyModelAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        if '_save_as_draft' in request.POST.keys():
            # Do your custom stuff, e.g.
            obj.is_draft = True

        # Let Django do its defaults.
        super(MyModelAdmin, self).save_model(request, obj, form, change)        

一件重要的事情是save_model() 必须保存实例。这意味着,如果该方法或其if/else个分支之一未调用super,您需要确保在某处调用obj.save()

根据点击的按钮,有更多可能性来自定义工作流程。要点是,request实例中提供了此信息,大多数相关的ModelAdmin方法都可以访问该实例。

E.g。另一个有趣的用例是在点击另存为草稿按钮后将用户重定向到其他位置,这可以通过覆盖response_add()response_change()来实现。