Django1.10:
1) 覆盖admin/submit_line.html:
{% load i18n admin_urls %}
<div class="submit-row">
{% if extra_buttons %}
{% for button in extra_buttons %}
{{ button }}
{% endfor %}
{% endif %}
{% if show_save %}<input type="submit" value="{% trans 'Save' %}" 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>
当然,这假定button 的字符串表示是适当的浏览器input 或button 元素,并用django.utils.safestring.mark_safe 标记为安全。或者,您可以使用safe 模板过滤器或直接访问button 的属性来构造<input>。在我看来,最好将这些东西隔离到python级别。
2) 覆盖MyModelAdmin.change_view:
def change_view(self, request, object_id, form_url='', extra_context=None):
extra_context = extra_context or self.extra_context()
return super(PollAdmin, self).change_view(
request, object_id, form_url, extra_context=extra_context,
)
此方法使您可以轻松地将按钮添加到任何ModelAdmin。作为步骤 (1) 的替代方案,您可以扩展 admin/change_form.html 并覆盖块 submit_row。由于模板中需要额外的标签,这会稍微冗长一些。
如果您希望在所有模型(或特定子集)中都可以使用额外操作,则使用所需功能对 ModelAdmin 进行子类化(例如,将归档添加到模型中。您甚至可以为删除添加覆盖-- 和其他默认按钮 -- 以便模式被存档而不是被删除;这需要一些模板修改)