Jinja2中多个相同名称的块
在Jinja2中,我有一个基础模板,内容如下:
<title>{% block title %}{% endblock %} - example.com</title>
[...]
<h1>
{% block title %}{% endblock %} - example.com
</h1>
然后,Jinja2出现了以下错误信息:
lines = [self.message, ' ' + location]
: block 'title' defined twice
现在应该很明显我想要做什么了——我希望在两个地方使用相同的标题:一个是在TITLE标签中,另一个是在H1标签中,但这个标题的一部分实际上是由其他派生模板提供的。
通常情况下,怎么才能做到这一点呢?
2 个回答
4
这个想法是,在一个宏里面创建一个块,然后调用这个宏两次,而不是把“块”标签重复写两遍。
在最新的Jinja2版本中,这样做是可行的:
layout.html
{%- extends "base.html" -%}
{%- macro duplicated() -%}
{% block overrideninchild %}{% endblock %}
{%- endmacro -%}
{% block base_content %}
{{ duplicated() }}
{{ duplicated() }}
{% endblock %}
child_page.html
{%- extends "layout.html" -%}
{% block overrideninchild %}
Should be visible twice.
{% endblock %}
101
正如这里所描述的,定义一个块就会在一个叫“self”的特殊对象中创建一个与这个块同名的宏:
<title>{% block title %}{% endblock %} - example.com</title>
[...]
<h1>
{{ self.title() }} - example.com
</h1>