Spec-Zone.ru › Jinja 2.9

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

В этой части документации приведены некоторые советы и хитрости для шаблонов Jinja2.

Обработка значений NULL

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.9.x/tricks/

Spec-Zone.ru

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