Советы и хитрости
Эта часть документации демонстрирует некоторые советы и хитрости для шаблонов Jinja.
Обработка значений NULL
Jinja поддерживает динамическое наследование и не различает родительский и дочерний шаблоны, пока не встретится тег extends. Хотя это приводит к неожиданному поведению, когда всё до первого тега extends, включая пробелы, выводится вместо игнорирования, это можно использовать для интересного трюка.
Обычно дочерние шаблоны наследуют от одного шаблона, добавляющего базовый HTML-скелет. Однако возможно поместить тег extends в тег if, чтобы наследовать только от шаблона макета, если переменная standalone имеет значение false, что происходит по умолчанию, если она не определена. Кроме того, в файл добавляется очень базовый скелет, так что если он действительно рендерится с standalone, установленным в True, добавляется очень базовый HTML-скелет:
{% if not standalone %}{% extends 'master.html' %}{% endif -%}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<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 может принимать неограниченное количество строк. Каждый раз, когда этот тег встречается, рендерится следующий элемент из списка.
Выделение активных пунктов меню
Часто вам нужна навигационная панель с активным пунктом меню. Это очень просто реализовать. Поскольку присваивания вне block в дочерних шаблонах являются глобальными и выполняются до оценки шаблона макета, можно определить активный пункт меню в дочернем шаблоне:
{% extends "layout.html" %}
{% set active_page = "index" %}
Шаблон макета может затем получить доступ к active_page. Кроме того, имеет смысл определить значение по умолчанию для этой переменной:
{% set navigation_bar = [
('/', 'index', 'Index'),
('/downloads/', 'downloads', 'Downloads'),
('/about/', 'about', 'About')
] -%}
{% set active_page = active_page|default('index') -%}
...
<ul id="navigation">
{% for href, id, caption in navigation_bar %}
<li{% if id == active_page %} class="active"{% endif
%}><a href="{{ href|e }}">{{ caption|e }}</a></li>
{% endfor %}
</ul>
...
Доступ к родительскому циклу
Специальная переменная 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–2020 Pallets
Licensed under the BSD 3-clause License.
https://jinja.palletsprojects.com/en/2.11.x/tricks/