Spec-Zone.ru › Jinja 2.11

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

Эта часть документации демонстрирует некоторые советы и хитрости для шаблонов 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/

Spec-Zone.ru

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