在 django 自定义模型管理添加页面处理自定义提交按钮的正确方法
Proper way to handle custom submit button at django custom model admin add page
我想在 submit_line.html
添加一个额外的按钮,它做的事情与提交完全相同,但它在向服务器发送 post 请求时将某些字段设置为其他内容。
假设我有一个博客作为模型,我想添加 "save as draft" 作为按钮。
我的 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>
现在我不明白它是如何发出这个请求的,所以我无法修改它,所以请帮助我解决这个问题。
首先,给你的按钮一个独特的 name
:
{% if show_save_as_draft %}
<input type="submit"
value="{% trans 'Save as draft' %}"
class="default"
name="_save_as_draft" />
{% endif %}
然后,在您的 ModelAdmin
you can override the 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
方法中访问。
例如另一个有趣的用例是在点击 另存为草稿 按钮后将用户重定向到其他地方,这可以通过覆盖 response_add()
and response_change()
.
来实现
我想在 submit_line.html
添加一个额外的按钮,它做的事情与提交完全相同,但它在向服务器发送 post 请求时将某些字段设置为其他内容。
假设我有一个博客作为模型,我想添加 "save as draft" 作为按钮。
我的 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>
现在我不明白它是如何发出这个请求的,所以我无法修改它,所以请帮助我解决这个问题。
首先,给你的按钮一个独特的 name
:
{% if show_save_as_draft %}
<input type="submit"
value="{% trans 'Save as draft' %}"
class="default"
name="_save_as_draft" />
{% endif %}
然后,在您的 ModelAdmin
you can override the 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
方法中访问。
例如另一个有趣的用例是在点击 另存为草稿 按钮后将用户重定向到其他地方,这可以通过覆盖 response_add()
and response_change()
.