47

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 标签,但标题的一部分实际上是由其他派生模板提供的。

通常如何实现这一目标?

4

2 回答 2

90

如此所述,定义一个块会在特殊的“self”对象中创建一个带有块名的宏:

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

<h1> 
  {{ self.title() }} - example.com
</h1>
于 2009-08-07T14:27:05.927 回答
3

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

在最新的 Jinja2 版本中,这有效:

布局.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 %}
于 2019-03-29T00:23:47.673 回答