【问题标题】:Multiple blocks of same name in Jinja2Jinja2中的多个同名块
【发布时间】:2010-11-17 13:17:07
【问题描述】:
在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 标签,但标题的一部分实际上是由其他派生模板提供的。
通常如何实现这一目标?
【问题讨论】:
标签:
python
html
templates
jinja2
【解决方案1】:
正如 here 所记录的,定义一个块会创建一个宏,该宏在特殊的“self”对象中具有块的名称:
<title>{% block title %}{% endblock %} - example.com</title>
[...]
<h1>
{{ self.title() }} - example.com
</h1>
【解决方案2】:
这个想法是在宏内创建一个块,然后调用宏两次,而不是让“块”标签重复两次。
在最新的 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 %}