В материале рассмотрены различные помощники, определенные на глобальном уровне модуля jinja2
, которые упрощают жизнь при работе с шаблонами.
range()
арифметическая прогрессия целых чисел,lipsum()
создает последовательность lorem ipsum
,dict()
альтернатива литералам словаря,cycler()
циклически перебирает значения,joiner()
возвращать переданную строку при каждом вызове, кроме первого,namespace()
позволяет переносить переменные из тела цикла во внешнюю область.range([start, ]stop[, step])
:Помощник range()
возвращает список, содержащий арифметическую прогрессию целых чисел. Вызов range(i, j)
возвращает [i, i+1, i+2, ..., j-1]
. Аргумент start
по умолчанию равен 0. Когда задан шаг step
, то он указывает приращение (или уменьшение). Например, range(4)
и range(0, 4, 1)
возвращают [0, 1, 2, 3]
. Конечная точка stop
опущена! Это точно допустимые индексы для списка из 4 элементов.
Помощник range()
полезен для повторения блока шаблона несколько раз, например для заполнения списка. Представьте, что в списке 7 пользователей, но при этом необходимо отобразить три пустых элемента, чтобы задать высоту с помощью CSS:
<ul> {% for user in users %} <li>{{ user.username }}</li> {% endfor %} {% for number in range(10 - users|count) %} <li class="empty"><span>...</span></li> {% endfor %} </ul>
lipsum(n=5, html=True, min=20, max=100)
:Помощник lipsum()
создает некоторую последовательность lorem ipsum
для шаблона. По умолчанию создается пять абзацев HTML с каждым абзацем от 20 до 100 слов. Если аргумент html=False
, то возвращается обычный текст. Это полезно для создания простого содержимого для тестирования макета.
dict(**items)
:Помощник dict()
это удобная альтернатива литералам словаря. {'foo': 'bar'}
это то же самое, что dict(foo='bar')
.
cycler(*items)
:Помощник cycler()
циклически перебирает значения, выдавая их по одному за раз, а затем перезапускает, как только будет достигнут конец. Аргумент Items
- каждый позиционный аргумент будет выводиться в порядке, указанном для каждого цикла.
Аналогичен специальной переменной цикла loop.cycle
, но может использоваться вне циклов или в нескольких циклах. Ниже представлен пример, визуализации списка папок и файлов, которым поочередно присваивается "нечетные" и "четные" CSS классы.
{% set row_class = cycler("odd", "even") %} <ul class="browser"> {% for folder in folders %} <li class="folder {{ row_class.next() }}">{{ folder }} {% endfor %} {% for file in files %} <li class="file {{ row_class.next() }}">{{ file }} {% endfor %} </ul>
Объект помощника cycler
имеет атрибут и 2 метода:
cycler.current
: возвращает текущий элемент. Эквивалентно элементу, который будет возвращен при следующем вызове cycler.next()
.cycler.next()
: возвращает текущий элемент, затем переходит к следующему элементу.cycler.reset()
: сбрасывает текущий элемент на первый элемент.joiner(sep=', ')
:Крошечный помощник joiner()
, который можно использовать для "объединения" нескольких разделов. Помощнику передается строка, и он будет возвращать эту строку при каждом вызове, кроме первого раза (возвращает пустую строку).
{% set pipe = joiner("|") %} {% if categories %} {{ pipe() }} Categories: {{ categories|join(", ") }} {% endif %} {% if author %} {{ pipe() }} Author: {{ author() }} {% endif %} {% if can_edit %} {{ pipe() }} <a href="?action=edit">Edit</a> {% endif %}
namespace(...)
:Помощник namespace()
создает новый контейнер, которому позволяет присваивать атрибуты с помощью тега {% set %}
:
{% set ns = namespace() %} {% set ns.foo = 'bar' %}
Основная цель всего этого состоит в том, чтобы позволить переносить значение из тела цикла {% for ... %}
во внешнюю область. Начальные значения могут быть предоставлены в виде словаря dict
или в качестве ключевых аргументов:
{% 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 }}