Советы и хитрости
Эта часть документации демонстрирует несколько советов и хитростей для шаблонов Jinja.
Обработка отсутствующих значений по умолчанию
Jinja поддерживает динамическое наследование и не различает родительский и дочерний шаблон, пока не встретится тег extends. Хотя это приводит к неожиданному поведению, когда всё до первого тега extends, включая пробелы, выводится вместо игнорирования, это можно использовать для интересного трюка.
Обычно дочерние шаблоны наследуются от шаблона, добавляющего базовый HTML-скелет. Однако можно поместить тег extends в тег if, чтобы наследоваться только от макетного шаблона, если переменная standalone имеет значение false, что по умолчанию происходит, если она не определена. Кроме того, в файл добавлен очень базовый скелет, так что если он действительно рендерится с standalone установленным в True, добавляется очень базовый HTML-скелет:
{% if not standalone %}{% extends 'default.html' %}{% endif -%}
<!DOCTYPE html>
<title>{% block title %}The Page Title{% endblock %}</title>
<link rel="stylesheet" href="style.css" type="text/css">
{% block body %}
<p>This is the page body.</p>
{% endblock %}
Очередность строк
Если вы хотите применить разные стили к каждой строке таблицы или списка, вы можете использовать метод cycle объекта loop:
<ul>
{% for row in rows %}
<li class="{{ loop.cycle('odd', 'even') }}">{{ row }}</li>
{% endfor %}
</ul>
cycle может принимать неограниченное количество строк. Каждый раз, когда этот тег встречается, рендерится следующий элемент из списка.
Доступ к родительскому циклу
Специальная переменная loop всегда указывает на самый внутренний цикл. Если необходимо получить доступ к внешнему циклу, можно присвоить ему псевдоним:
<table>
{% for row in table %}
<tr>
{% set rowloop = loop %}
{% for cell in row %}
<td id="cell-{{ rowloop.index }}-{{ loop.index }}">{{ cell }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
© 2007–2021 Pallets
Licensed under the BSD 3-clause License.
https://jinja.palletsprojects.com/en/3.1.x/tricks/