Django模板中的"{% extends %}"和"{% include %}

129 投票
8 回答
209965 浏览
提问于 2025-04-15 14:14

我想在两个不同的基础文件中提供相同的内容。

所以,我正在尝试这样做:

page1.html:

{% extends "base1.html" %}
{% include "commondata.html" %}

page2.html:

{% extends "base2.html" %} 
{% include "commondata.html" %}

问题是我似乎不能同时使用扩展和包含。有没有办法做到这一点?如果没有,我该如何实现上面的内容呢?

commondata.html覆盖了在base1.htmlbase2.html中都指定的一个部分。

这样做的目的是为了提供相同的页面,分别以pdfhtml格式呈现,但格式稍有不同。不过,上面的问题简化了我想要做的事情,所以如果能得到这个问题的答案,就能解决我的问题。

8 个回答

45

这样做就可以解决你的问题:把包含标签放在一个区块部分里面。

page1.html:

{% extends "base1.html" %}

{% block foo %}
   {% include "commondata.html" %}
{% endblock %}

page2.html:

{% extends "base2.html" %}

{% block bar %}
   {% include "commondata.html" %}
{% endblock %}
86

来自Django文档:

include标签应该被理解为“渲染这个子模板并包含它的HTML”,而不是“解析这个子模板并把它的内容当作父模板的一部分”。这意味着被包含的模板之间没有共享的状态——每次包含都是一个完全独立的渲染过程。

所以,Django不会从你的commondata.html中提取任何块,也不知道如何处理块外的渲染HTML。

131

当你使用 extends 模板标签时,其实是在告诉系统,当前的模板是基于另一个模板的,也就是说它是一个子模板,依赖于一个父模板。Django 会查看你的子模板,并用它的内容来填充父模板。

在子模板中,你想要使用的所有内容都应该放在块(blocks)里面,Django 会利用这些块来填充父模板。如果你想在子模板中使用包含语句(include),也必须把它放在一个块里,这样 Django 才能理解。否则,它就没法理解你想表达的意思,Django 就不知道该怎么处理了。

Django 的文档中有一些很好的例子,展示了如何使用块来替换父模板中的块。

https://docs.djangoproject.com/en/dev/ref/templates/language/#template-inheritance

撰写回答