有人知道一种同时扩展原始模板并覆盖特定块的方法吗?(关键是这样做时不要更改模板名称,因为在某些情况下,你可能必须更改视图以使其与另一个模板配合使用)
编辑:正如 Adam Taylor 在 Django 1.9 on 的评论中指出的那样,现在可以在没有任何 hack 的情况下实现此操作。
我认为这个相关问题的答案很恰当;目前,最好的解决方案似乎是使用PyPI上的django-apptemplates包中的自定义模板加载程序,因此您可以使用pip进行安装(例如:pip install django-apptemplates
)。
模板加载程序允许您在特定应用程序中扩展模板;例如,要扩展管理员界面的索引页面,您需要添加
'apptemplates.Loader',
settings.py
文件中的TEMPLATE_LOADERS
列表中,并使用:{% extends "admin:admin/index.html" %}
在你的模板中。
Django 1.9及更高版本有此功能:
Django模板加载器现在可以递归扩展模板。
因此,您可以拥有来自app1
的文件,其内容如下:
app1/templates/example/foobar.html
:
<p>I'm from app1</p>
{% block main %}{% endblock %}
你可以使用app2
中的文件来扩展它(请注意,模板名称example/foobar.html
是相同的):
app2/templates/example/foobar.html
:
{% extends "example/foobar.html" %}
{% block main %}
<p>I'm from app2</p>
{% endblock %}
最终结果应该是:
<p>I'm from app1</p>
<p>I'm from app2</p>
app1
有一组相关的模板(比如app1/templates/app1/base.html
,它被app1/templates/app1/subfolder/subsite.html
扩展),那么app2
的模板应该如何同时扩展这两个模板?我认为使用您的方法--在app1
中复制文件夹层次结构和文件名--会起作用,但似乎并没有。 - Soul Donut pip install -U django-overextends
app_directories
模板加载器,则无法直接应用该技巧。[更新]
我误读了问题,我的原始答案仅适用于管理员应用程序,该应用程序具有内置的模板扩展机制。对于其他缺乏此类机制的应用程序,我将只是分叉原始模板,而不是像所选答案建议的那样摆弄自定义模板加载器。如果您担心分叉,您也可以实现扩展机制并向原始项目贡献,如果您认为它值得。
直接从精细的手册中得知: 由于管理模板的模块化设计,通常不必也不建议替换整个模板。更好的方法是只覆盖需要更改的模板部分。
接着上面的例子,我们希望在页面模型的历史工具旁边添加一个新链接。在查看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 目录中,我们的链接将出现在每个模型的更改表单上。
niceapp.views.index()
使用模板 niceapp/index.html
,如果我想使用原视图功能但自定义模板,我可以在项目或自己的应用程序的 templates
目录下创建一个 niceapp/index.html
。但是如何扩展原始模板并仅覆盖其中一些块,而不是复制整个模板?使用 {% extend "niceapp/index.html" %}
显然无法完成任务。 - akaihola一个简单的方法是这样的:
假设你想要扩展和覆盖django/contrib/admin/templates/admin/change_form.html。
首先,将原始的change_form.html复制到你的应用程序模板目录中,并将其重命名为类似于myapp/templates/admin/original_change_form.html的名称。(你也可以使用符号链接来完成此操作。)
第二步,在myapp/templates/admin中创建你自己的change_form.html。在顶部放置以下内容:
{% extends "admin/original_change_form.html" %}
简单!