Несколько блоков с одинаковым именем в Jinja2 - PullRequest
30 голосов
/ 07 августа 2009

В 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 ]

63 голосов
/ 07 августа 2009

Как задокументировано здесь , определение блока создает макрос с именем блока в специальном объекте "self":

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

<h1> 
  {{ self.title() }} - example.com
</h1>
0 голосов
/ 29 марта 2019

Идея состоит в том, чтобы создать блок внутри макроса, а затем дважды вызвать макрос, вместо того, чтобы дважды повторять тег "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 %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...