问题 Django模板:为什么包含模板中的块不能被子模板覆盖?


为了更清楚地说明我的问题,我们假设我有一个包含内容的include.html模板:

{% block test_block %}This is include{% endblock %}

我有另一个名为parent.html的模板,内容如下:

This is parent

{% include "include.html" %}

现在我创建一个名为child.html的模板,它扩展了parent.html:

{% extends "parent.html" %}
{% block test_block %}This is child{% endblock %}

我的想法是,在渲染child.html时,child.html中的test_block可以覆盖include.html中的test_block。根据我的理解,当包含模板时,它将按原样包含在内。所以在我的情况下,我认为parent.html等于:

This is parent

{% block test_block %}This is include{% endblock %}

所以child.html应该能够覆盖test_block。但看起来它不能。为什么?有解决方法吗?


7389
2017-10-21 02:31


起源



答案:


当您包含模板时,它会呈现模板,然后包含呈现的内容。

来自django文档:

include标记应该被视为“渲染此子模板并包含HTML”的实现,而不是“解析此子模板并将其内容包含在内,就好像它是父类的一部分”。这意味着包含的模板之间没有共享状态 - 每个包含都是完全独立的渲染过程。

解决方法是让子模板扩展 包括 模板而不是包含模板。然后,包括子模板。


13
2017-10-21 03:01