Jinja2中多个相同名称的块

51 投票
2 回答
13842 浏览
提问于 2025-04-15 13:26

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>

撰写回答