Django 模板:为何包含模板中的 block 不能被子模板覆盖?

11 投票
1 回答
3670 浏览
提问于 2025-04-16 05:49

为了更清楚地说明我的问题,假设我有一个叫做 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 中的内容。根据我的理解,当一个模板被包含时,它是原封不动地被包含进来的。所以在我的例子中,我认为 parent.html 等于:

This is parent

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

所以 child.html 应该能够覆盖 test_block。但看起来它做不到。为什么呢?有没有解决办法?

1 个回答

13

当你使用一个模板的时候,它会先把这个模板渲染出来,然后再把渲染好的内容放到页面上。

根据django的文档:

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

一个解决办法是让子模板去扩展被包含的模板,而不是扩展包含它的模板。然后,再把子模板包含进来。

撰写回答