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

Geo*_*gie 11 python django templates include extend

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

{% block test_block %}This is include{% endblock %}
Run Code Online (Sandbox Code Playgroud)

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

This is parent

{% include "include.html" %}
Run Code Online (Sandbox Code Playgroud)

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

{% extends "parent.html" %}
{% block test_block %}This is child{% endblock %}
Run Code Online (Sandbox Code Playgroud)

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

This is parent

{% block test_block %}This is include{% endblock %}
Run Code Online (Sandbox Code Playgroud)

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

Ber*_*Sed 13

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

来自django文档:

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

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