Сообщить об ошибке.

Создание и присвоение переменных в шаблонах jinja2

Внутри блоков с кодом кодом шаблона можно присваивать значения переменным. Присвоения значений на верхнем уровне (за пределами блоков {% block ... %}, макросов {% macro ... %} или циклов {% for ... %}) экспортируются из шаблона, как макросы верхнего уровня, и могут быть импортированы с другими шаблонами.

Присваивать значения переменным можно используя тег {% set ... %}, также присвоения могут иметь несколько целей:

{% set navigation = [('index.html', 'Index'), ('about.html', 'About')] %}
{% set key, value = call_something() %}

Область видимости переменных, определенных как {% set ... %}.

Имейте в виду, что невозможно установить переменные внутри блока {% block ... %}{% endblock %} и сделать так, чтобы они отображались за его пределами. Это касается и циклов {% for ... %}{% endfor %}. Единственным исключением из этого правила являются блоки {% if ... %}{% endif %}, которые не вводят область видимости. В результате следующий шаблон не будет делать то, что ожидается:

{% set iterated = false %}
{% for item in seq %}
    {{ item }}
    {% set iterated = true %}
{% endfor %}
{# здесь переменная `iterated` будет всегда `false` #}
{% if not iterated %} did not iterate {% endif %}

Такое поведение переменной iterated невозможно с синтаксисом шаблонов Jinja2. Вместо этого используйте альтернативные конструкции, такие как блок цикла else или специальную переменную цикла loop:

{% for item in seq %}
    {{ item }}
{% else %}
    did not iterate
{% endfor %}

Начиная с версии Jinja 2.10, более сложные варианты использования можно обрабатывать с помощью объектов пространства имен namespace(), которые позволяют распространять изменения по областям:

{% set ns = namespace(found=false) %}
{% for item in items %}
    {% if item.check_something() %}
        {% set ns.found = true %}
    {% endif %}
    * {{ item.title }}
{% endfor %}
Found item having something: {{ ns.found }}

Обратите внимание, что запись obj.attr в теге {% set ... %} разрешена только для объектов пространства имен namespace. Попытка присвоить атрибут любому другому объекту вызовет исключение.

Присвоение переменным целых блоков.

Начиная с Jinja 2.8, можно записывать содержимое целого блока в имя переменной. Это может быть полезно в некоторых ситуациях в качестве альтернативы макросам.

{% set navigation %}
    <li><a href="/">Index</a>
    <li><a href="/downloads">Downloads</a>
{% endset %}

В примере, в переменную navigation запишется исходный HTML-код навигации, расположенный внутри тега {% set navigation %}{% endset %}.

Начиная с Jinja 2.10, присвоение переменным блоков, поддерживает использование фильтров.

{% set reply | wordwrap %}
    Вы писали:
    {{ message }}
{% endset %}