Jinja2中有多个同名的块

时间:2009-08-07 00:18:14

标签: python html templates 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 个答案:

答案 0 :(得分:62)

如记录here,定义一个块会在特殊的“self”对象中创建一个带有块名称的宏:

<title>{% block title %}{% endblock %} - example.com</title>
[...]

<h1> 
  {{ self.title() }} - example.com
</h1>

答案 1 :(得分:0)

这个想法是在宏内创建一个块,然后两次调用宏,而不是重复两次“ block”标签。

在最新的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 %}