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

Список помощников шаблонов jinja2 в Python

В материале рассмотрены различные помощники, определенные на глобальном уровне модуля jinja2, которые упрощают жизнь при работе с шаблонами.

Содержание:


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 }}