Spec-Zone.ru › Jinja 3.1

Советы и хитрости

Эта часть документации демонстрирует несколько советов и хитростей для шаблонов 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 может принимать неограниченное количество строк. Каждый раз, когда этот тег встречается, рендерится следующий элемент из списка.

Выделение активных пунктов меню

Часто вы хотите иметь панель навигации с выделенным активным пунктом. Это очень легко реализовать. Поскольку присваивания вне тегов 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–2021 Pallets
Licensed under the BSD 3-clause License.
https://jinja.palletsprojects.com/en/3.1.x/tricks/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API