包含文件中的块未被扩展模板填充

时间:2013-02-25 01:54:57

标签: python flask jinja2

我有一个看起来像这样的模板:

{% include "base/top.html" with context %}
{% include "base/nav.html" with context %}
<div id="content">
    Stuff
    {% block content %}{% endblock %}
</div>
{% include "base/bottom.html" with context %}

base/nav.htmlbase/bottom.html包含静态内容,但base/top.html包含{% block title %}。因此,当我有第二个模板时,尝试从第一个文件继承,如下所示:

{% extends firstfile.html %}
{% block title %}Imarealpage!{% endblock %}
{% block content %}Lorem ipsum dorem smitshm{% endblock %}

未呈现{% block title %}部分。如何确保它和包含文件中的任何其他块以及扩展模板中定义的块都按原样呈现?

1 个答案:

答案 0 :(得分:2)

你误解了{% include %}的工作原理。 {% include %}标记不是预处理器;在渲染之前,它不会将包含的模板代码直接插入到包含模板中。相反,{% include %}会触发包含模板的新独立模板渲染(就像您直接从自己的代码渲染包含的模板一样),然后将渲染的结果包含在内包含模板的渲染。

这意味着包含的模板与其包含模板具有完全独立的继承层次结构。例如,您可以使用基本component.html模板,其中包含一些块,然后例如以foo-component.html开头的{% extends "component.html" %}并填写component.html的部分块。然后,您可以拥有一个layout.html{% include "foo-component.html" %},这将呈现foo-component.html,并继承component.html,并将结果放入layout.html中的那个位置1}}。但是layout.html中的任何块与component.html中的任何块之间没有任何关系 - 它们是具有单独块结构和继承层次结构的单独呈现。