Советы и хитрости
В этой части документации представлены некоторые советы и хитрости для шаблонов Jinja2.
Обработка Null-Master Fallback
Jinja2 поддерживает динамическое наследование и не различает родительский и дочерний шаблон, пока не встретится тег 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.10.x/tricks/