Создание переменных
Внутри блоков с кодом кодом шаблона можно присваивать значения переменным. Присвоения значений на верхнем уровне (за пределами блоков {% 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(i=1) %}
{% for task in tasks %}
{{ ns.i }}. {{ task }}
{% set ns.i = ns.i + 1 %}
{% endfor %}
Обратите внимание, что запись 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 %}
Last updated