Поведение контекста для блоков jinja2 с включенными файлами - PullRequest
0 голосов
/ 26 марта 2019

У меня проблемы с пониманием поведения контекста при включении файлов в блоки Jinja2.См. Этот минимальный пример:

base.jinja2

{% set foo="bar" %}

{% block content %}
{% include 'include.jinja2' %}
{% endblock content %}

include.jinja2

{{ foo }}

Рендеринг base.jinja2 выдает ошибку foo' is undefined.

Когда я перемещаю объявление foo в блок content, код отображается правильно.То же самое происходит, когда я перемещаю оператор include за пределы блока content, когда я удаляю блок content вокруг оператора include или когда я заменяю оператор include содержимым файла.

Почему это?Как я могу использовать глобальную переменную foo во включаемом файле внутри блока content ?

1 Ответ

1 голос
/ 26 марта 2019

Посмотрите на ссылку , раздел Block Nesting and Scope:

Блоки могут быть вложены для более сложных макетов.Однако блоки по умолчанию могут не иметь доступа к переменным из внешних областей: причина этого в том, что если блок будет заменен дочерним шаблоном, появится переменная, которая не была определена в блоке или передана в контекст.

Согласно документу и начиная с Jinja 2.2, вы можете изменить это поведение, используя scoped.

{% set foo="bar" %}

{% block content scoped %}
{% include 'include.jinja2' %}
{% endblock content %}

Я согласен, что это несколько странно по сравнению с тем, к чему мы привыкли.Но это преднамеренная особенность.

Вообще говоря, include - это только передаваемый контекст.Начиная с версии 2.1 ему передается производный контекст, который является исходным контекстом + все локальные переменные, используемые перед оператором include.Это также означает, что если вы просто используете переменную из внешней области видимости, Jinja2 теперь будет отслеживать ее как локальную и передавать ее в производный контекст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...