[更新]
我误解了问题,我原来的答复仅适用于管理应用程序,它有一个内置的模板扩展机制。对于缺乏这种机制的其他应用程序,我只需分叉原始模板,而不是像自定义的模板加载器那样摆弄选定的答案。如果你担心分叉,你也可以实施一个扩展机制,如果你认为它是值得的,那么回馈到原始项目。
[原创答案]
直从细manual: 由于管理模板的模块化设计,它通常是既无必要,也建议更换整个模板。只覆盖模板中需要更改的部分几乎总是更好。
继续上面的例子中,我们要添加旁边的历史工具的页面模型一个新的链接。在查看change_form.html之后,我们确定我们只需要重写object-tools块。因此,这里是我们的新change_form.html:
{% extends "admin/change_form.html" %}
{% load i18n %}
{% block object-tools %}
{% if change %}{% if not is_popup %}
<ul class="object-tools">
<li><a href="history/" class="historylink">{% trans "History" %}</a></li>
<li><a href="mylink/" class="historylink">My Link</a></li>
{% if has_absolute_url %}
<li><a href="../../../r/{{ content_type_id }}/{{ object_id }}/" class="viewsitelink">
{% trans "View on site" %}</a>
</li>
{% endif%}
</ul>
{% endif %}{% endif %}
{% endblock %}
就是这样!如果我们将这个文件放在templates/admin/my_app目录中,我们的链接将出现在每个模型的更改表单上。
@paulo:据我所知,大约有一般重写应用程序的模板,当然文档的,因为这是日常工作,但我从来没有见过任何东西关于扩展具有相同名称的模板。如果您知道这是在文档中,请将我指向该地点... – 2010-10-19 11:38:29
http://docs.djangoproject.com/en/dev/ref/contrib/admin/#overriding-vs-replacing-an-admin-template – 2010-10-19 11:53:30
此处的方法仅适用于特定于应用程序的管理模板,因为这些模板将转到与原始模板不同的路径。Iguess这就是为什么这是在*管理*文档,而不是在一般;) – 2011-09-14 16:19:43