Django模板中的"{% extends %}"和"{% include %}
我想在两个不同的基础文件中提供相同的内容。
所以,我正在尝试这样做:
page1.html:
{% extends "base1.html" %}
{% include "commondata.html" %}
page2.html:
{% extends "base2.html" %}
{% include "commondata.html" %}
问题是我似乎不能同时使用扩展和包含。有没有办法做到这一点?如果没有,我该如何实现上面的内容呢?
commondata.html
覆盖了在base1.html
和base2.html
中都指定的一个部分。
这样做的目的是为了提供相同的页面,分别以pdf
和html
格式呈现,但格式稍有不同。不过,上面的问题简化了我想要做的事情,所以如果能得到这个问题的答案,就能解决我的问题。
8 个回答
这样做就可以解决你的问题:把包含标签放在一个区块部分里面。
page1.html:
{% extends "base1.html" %}
{% block foo %}
{% include "commondata.html" %}
{% endblock %}
page2.html:
{% extends "base2.html" %}
{% block bar %}
{% include "commondata.html" %}
{% endblock %}
来自Django文档:
include标签应该被理解为“渲染这个子模板并包含它的HTML”,而不是“解析这个子模板并把它的内容当作父模板的一部分”。这意味着被包含的模板之间没有共享的状态——每次包含都是一个完全独立的渲染过程。
所以,Django不会从你的commondata.html中提取任何块,也不知道如何处理块外的渲染HTML。
当你使用 extends 模板标签时,其实是在告诉系统,当前的模板是基于另一个模板的,也就是说它是一个子模板,依赖于一个父模板。Django 会查看你的子模板,并用它的内容来填充父模板。
在子模板中,你想要使用的所有内容都应该放在块(blocks)里面,Django 会利用这些块来填充父模板。如果你想在子模板中使用包含语句(include),也必须把它放在一个块里,这样 Django 才能理解。否则,它就没法理解你想表达的意思,Django 就不知道该怎么处理了。
Django 的文档中有一些很好的例子,展示了如何使用块来替换父模板中的块。
https://docs.djangoproject.com/en/dev/ref/templates/language/#template-inheritance