Использование loop.counter в шаблоне Python Jinja для цикла
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Чтобы показать счётчик в цикле Jinja, используйте loop.index
— счёт начнется с 1. Если же счёт должен начинаться с нуля, используйте loop.index0
:
{% for item in sequence %}
{{ loop.index }}: {{ item }}
{% endfor %}
Таким образом, если нужно начать с нуля, loop.index
заменяется на loop.index0
.
Расширяем возможности циклов Jinja для улучшения шаблонов
Уменьшение кода с loop.revindex
С помощью loop.revindex
можно работать с обратным отсчётом. Это аналогично обратному отсчёту времени до момента, который вы ожидаете:
{% for item in sequence %}
{{ loop.revindex }}: {{ item }} // Как обратный отсчет до посещения стоматолога
{% endfor %}
Отслеживание прогресса цикла: Всегда в курсе
loop.first
и loop.last
помогают легко определить начало и конец цикла, что упрощает навигацию:
{% for user in users %}
{% if loop.first %}
Первый в очереди: {{ user.name }}! // Статус VIP обеспечен
{% elif loop.last %}
Последний, но не менее значимый: {{ user.name }}. // Сохраняем лучшее на потом
{% else %}
Следующий: {{ user.name }}
{% endif %}
{% endfor %}
Несложная конкатенация в Jinja Template
С loop.index0
вы можете просто конкатенировать строки и формировать ID элементов без всякой магии:
{% for item in items %}
<div id="item-{{ loop.index0 }}"> Контент </div>
{% endfor %}
Повышаем уровень: Манипулируем переменными внутри циклов
set
в Jinja: внедряемся в цикл
set
позволяет определить или изменить переменные внутри цикла без лишних усилий:
{% for item in items %}
{% set new_item = item|upper %}
{{ loop.index }} – {{ new_item }} // Только ЗАГЛАВНЫЕ БУКВЫ. Мы не кричим, обещаем.
{% endfor %}
Django против Jinja: сравниваем два счётчика
Не следует путать счётчик цикла Django forloop.counter
с счётчиками в Jinja. Несмотря на внешнюю схожесть, они выполняют разные функции.
Руководство по использованию: Применение условных операторов в цикле
Условные выражения обогащают циклы Jinja, благодаря чему можно реализовывать сложную логику:
{% for number in numbers %}
{{ 'Четное' if number % 2 == 0 else 'Нечетное' }} // Анализируем, чётное число или нечётное.
{% endfor %}
Визуализация
Представьте себя участником гонки (🏎️), где каждый круг имеет свой номер. loop.counter
пригодится, чтобы отслеживать каждый пройденный круг:
{% for car in race_cars %}
Круг {{ loop.counter }}: 🏎️💨 (машина №{{ loop.counter }} мчится мимо) // Здесь нет ограничений на скорость!
{% endfor %}
Таким образом, вместе с loop.counter
с каждым кругом увеличивается и счётчик.
Изучаем управляющие инструкции Jinja
Jinja предоставляет множество инструментов, выходящих за рамки обычных циклов. Изучим некоторые из них и опробуем их в действии:
{% for user in users %}
{{ user.name }}
{% if user.has_error %}
{{ user.error_message }} // Ой, есть ошибка...
{% break %} // Пора прервать цикл!
{% endif %}
{% endfor %}
Вложенные циклы: Осваем Loop-ception
Вложенные циклы могут усложнить понимание кода, но loop.parentloop
в Jinja помогает разобраться в ситуации:
{% for category in categories %}
{{ category.name }}:
{% for product in category.products %}
– {{ loop.parentloop.index }}.{{ loop.index }} {{ product.name }} // Уровень Loop-ception: Профессионал
{% endfor %}
{% endfor %}
Полезные материалы
- Документация для дизайнера шаблонов — Jinja Documentation (3.0.x) — Исследуйте возможности переменных цикла for и общее использование Jinja.
- Документация для дизайнера шаблонов — Jinja Documentation (3.0.x) — Ознакомьтесь с функциями, позволяющими расширить управление циклами и использование шаблонов Jinja в целом.
- Шаблоны — Документация Flask (2.0.x) — Изучите шаблонизацию с Jinja пошагово.
- Основы шаблонизации в Jinja – Real Python — Универсальное руководство по Jinja и Flask.
- GitHub – pallets/jinja: Очень быстрый и выразительный движок шаблонов. — Погрузитесь в исходный код и возможности вклада в развитие движка шаблонов Jinja.
- Документация для дизайнера шаблонов — Jinja Documentation (3.0.x) — Откройте мир встроенных фильтров и тестов, которые помогут сделать ваши шаблоны ещё лучше.