Несколько блоков с одинаковым именем в Jinja2
Вопрос
В Джинджа2, у меня есть такой базовый шаблон:
<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, но часть заголовка фактически предоставляется другими производными шаблонами.
Как обычно этого достигают?
Решение
Как документировано здесь, определение блока создает макрос с именем блока в специальном объекте «self»:
<title>{% block title %}{% endblock %} - example.com</title>
[...]
<h1>
{{ self.title() }} - example.com
</h1>
Другие советы
Идея состоит в том, чтобы создать блок внутри макроса, а затем вызвать макрос два раза, вместо того, чтобы дважды повторять тег «блок».
В последней версии 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 %}
Не связан с StackOverflow