ENote
  • ✨Home
    • Відмова від відповідальності
  • Progr
    • Python
      • Модулі
        • pip
        • cgitb
        • datetime
          • Класс datetime() модуля datetime
            • Методы объекта datetime.datetime()
            • datetime.datetime examples
          • Класс timedelta() модуля datetime
            • datetime.timedelta examples
          • Класс date() модуля datetime
            • datetime.date examples
          • Класс time() модуля datetime
            • Формат для функций .strftime() и .strptime(). модуля datetime
        • os.path
        • pathlib
          • pathlib to str
        • subproces
        • os
        • Jinja
          • Синтаксис шаблонів Jinja
          • Клас Environment()
          • Простой пример cgi-скрипта c Jinja-шаблоном
          • Создание переменных
            • Як оновити глобальну змінну зсередини оператора IF / ELSE або циклу FOR
          • Фільтри і методи
          • Число у рядок, slices
          • Вбудовані фільтри Jinja2
        • re
          • re.search - example
          • re.findall - example
        • email / smtplib
          • Как отправлять электронные письма с помощью Python
        • requests
          • Як зберегти та завантажити файли cookie в запитах Python?
          • Извлечение и установка cookies с модулем requests в Python
          • Links
        • http.cookies
          • Всё о работе с cookie в Python — класс http.cookies
        • xlrd
        • xlwt
        • borb
          • ChunkOfText
          • send_usage_statistics
          • borb clear
          • 2.1.3 vs 2.1.15
          • QR-code
          • Залежності borb
        • JSON
          • Кирилиця в JSON
        • matplotlib
        • argparse
        • click
        • configparser
        • traceback
        • sys
          • exit()
        • mysql-connector-python
        • logging
        • icrawler
        • Auto Plates
        • rembg
        • random
      • Strings
        • Built-in methods
        • Форматування виводу
        • Початкові нулі
        • Рядок в число
      • list
        • Об’єднання списків
        • list.sort(), sorted()
        • list.reverse(), reversed()
        • all(), any()
        • sum(), min(), max()
        • map(), filter(), reduce()
        • join(), split()
      • tuple
      • dict
        • Об'єднання / злиття словників
        • Сортування словника Python: значення, ключі тощо
      • set
      • class Enum
      • Середнє арифметичне
      • Virtual environment
        • web-app
      • type(), isinstance()
      • __main__
      • Files & Dirs
        • Try except for exception handling
        • Cписок файлов директории
        • User Home Dir
        • Copy file
      • *args, **qwargs
      • Links
      • Область видимости
      • Handling a File Error
      • assert
      • if
      • Числа
        • Округлення чисел
        • Отримати число з рядка
      • Обработка исключений в Python
      • Файлы и сериализация данных
      • OOP
      • Net and Web
      • Структура проекта на Python
      • Распаковка итерируемых объектов
      • Links
      • Algorithms
      • Python exit commands: quit(), exit(), sys.exit() and os._exit()
      • Цикли for / while
      • uuid
    • JavaScript
      • String
        • replaceAll() polyfill
        • Шаблонные строки
      • Array
        • Все способы перебора массива в JavaScript
      • Object
      • document.location
      • RegExp
      • Examples
        • Вычисление остатка от деления
        • Остаток от деления и деление без остатка
        • Округление числа
      • XMLHttpRequest
      • alert, prompt, confirm
      • onclick
      • hidden, display:none
      • LocalStorage, sessionStorage
      • null, undefined
      • cookies (js)
      • var, let и const
        • var vs let
        • const
      • Модифікація DOM
        • DOM select
      • JSON
        • Try
      • fetch
      • typeof
      • FormData не включає disabled набори полів
      • FormData, fdata
      • Більше одного відео YouTube на одній сторінці
    • HTML, CSS
      • favicon
      • Деякі спецсимволи
      • meta
      • ASCII table
      • lang
      • Псевдоелементи ::after і ::before
      • Cursor
      • Об использовании нестандартных пробелов
      • Картинка фоном
      • Безпечні веб-шрифти
      • Завжди внизу, незалежно від пропорцій екрану
      • напівпрозорий елемент
      • Символи з тінью
      • SVG (bootstrap)
      • rel = canonical
      • link stylesheet: integrity & crossorigin
      • rel = noopener
    • Bootstrap
      • Form Validate
      • Password show/hide
    • Errors
  • Dev
    • Git
      • clone
      • git-scm (book)
      • git config
        • files .git*
        • core.filemode
        • core.sharedRepository
      • .gitignore
      • .gitkeep
      • Видалити з репозиторію
        • Видалений файл з однієї гілки...
      • Пам’ятка
        • Перегляд історії комітів
        • Скасувати git add
        • revert
        • Скасувати внесені зміни у файл
        • Додати до коміту файл
        • Видалити історію попередніх коммітів, та почати "з нуля"
        • Додати файли в останній коміт
      • Робота з гілками
        • Порівняти гілки
      • Git за полчаса
      • Три розділи проєкту Git
      • Merge conflict
      • Pull error
        • Git Error: You have divergent branches...
      • diff
      • Video
      • Merge скасувати
      • .gitignore: Permission denied
    • GitHub
      • SSH-підключення до GitHub
      • Перенести на сервер локальный репозиторий
      • Перенести на сервер репозиторій разом з історією
      • Створення змісту
    • Security
      • robots.txt
      • Cookies
    • Аутентифікація і cookies
      • ChatGPT
  • data
    • MySQL
      • MyISAM vs InnoDB
      • Типи даних
        • NULL (todo)
        • TIMESTAMP
        • YEAR
        • JSON
        • Требования к памяти для символьных типов
        • Поиск записей в таблице, которым нет соответствия в другой
      • Приклад створення БД, та користувача
        • Права для пользователей
      • Переглянути всі індекси таблиці
      • Копіювання, клонування таблиць
      • TEMPORARY TABLE
      • JOIN
      • ALTER TABLE
      • AUTO_INCREMENT
        • AUTO_INCREMENT у складовому індексі
      • LIMIT
        • Использование MySQL LIMIT
      • 10 Примеров входной загрузки данных из текстового файла в таблицы MySQL
      • Рішення
        • Выявление и удаление несвязанных записей
        • Выборка произвольных записей
        • Коректне сортування українських літер
        • Найти записи, которые присутствуют в одной таблице и отсутствуют во второй
        • Как удобно посмотреть данные...
        • Нахождение "дыр" в нумерации
        • Знайти дубликати полів в одній таблиці
        • Дані колонки 1 табл. перенести в 2 табл.
      • Функції
        • LAST_INSERT_ID()
        • GROUP_CONCAT
        • COUNT + DISTINCT
        • Функции для работы с датами и временем
      • Автоматизируйте создание бэкапов
      • mysqldump
        • Time Zone UTC
      • Результат запиту у файл
      • Результат запиту у змінну
      • Пособие по MySQL на Python
      • Змінні
      • Эмуляция функции row_number() в MySQL
      • Изучаем хранимые процедуры MySQL
      • SELECT DISTINCT
      • Dump всієї бази даних
      • Індекси
      • FOREIGN KEY
      • MAX(), MIN()
      • LENGTH, CHAR_LENGTH
      • Встановлення
    • MariaDB
    • PostgreSQL
      • Работа с базой данных PostgreSQL
      • Работаем с PostgreSQL через командную строку в Linux
    • Domains
      • Життєвий цикл доменів
      • Статус домена
    • SQLite, MySQL и PostgreSQL: сравниваем популярные реляционные СУБД
  • Linux
    • DNS
      • Как в DNS прописать 301 редирект
      • mail
        • SPF
          • Mirohost
        • _dmarc _domainkey
        • DKIM
        • Прописати ключі DKIM в exim
        • Листи з неіснуючим адресатом
    • Server
      • Zomro
        • pip
        • SSH-доступ по ключу (zomro)
        • venv
        • UnicodeEncodeError: 'latin-1' codec can't encode character
        • Mail Ports
        • Редірект з SSL-сертификатом на транзитному сайті
        • Редірект з SSL за допомогою .htaccess
      • Створення нового користувача з привілеями sudo в Ubuntu
      • SSH-доступ по ключу
      • Часовий пояс в Ubuntu 20.04
      • SSH-підключення командний рядок
      • Як встановити Python 3.9 (нижчу) на Ubuntu 22.04
      • Автозагрузка сервисов в Ubuntu
      • Підвищення безпеки SSH
      • Ubuntu Server
        • Art 01
    • Commands
      • adduser
      • apt
      • cat
      • ls
      • tar
      • ln
      • find
      • chmod
      • chown
      • mv
      • dig
      • ping
      • passwd
      • htpasswd
      • umask
      • usermode
      • history
      • cmp
      • chattr +i
    • Config
      • Keyboard
      • windows
      • My kbdswtch
      • Затримка при завантаженні системи
      • Files
        • /etc/resolv.conf
        • /boot/grub/grub.cfg
        • .config/user-dir.dirs
        • /etc/fstab
      • Як встановити шрифти
    • Apache
      • Встановлення
      • Подключить виртуальный хост
      • Файл .htaccess
        • Установка индексного файла
        • Фільтр IP-адрес
        • ModRewrite
          • Заборонити доступ за User-Agent
          • Перенаправити на іншу сторінку
          • Додавати слеш до адреси
        • Включити SSI
        • Виконувати скрипти CGI
        • Тимчасовий перехід з одного домену на інший
      • SSI
      • SSL
      • Відключити старт Apache з системою
      • Помилки
        • Скрипт не працює
        • CGI-скрипт не виводить кирилицю
        • Could not reliably determine
        • Permissions are missing on a component of the path
        • Symbolic link not allowed or link target not accessible
      • AddType, AddLanguage, AddCharset
    • Nginx
      • 301 редирект з www. та http: на https://(без www.)domain
    • Soft
      • SublimeText
        • Plugins
      • Firefox
      • Gwenview
      • inkscape
      • Double Commander
      • nano
      • mc
        • Знайти потрібний файл
      • meld / diffuse
      • hexedit
      • Kazam - відео з екрану
      • VeraCrypt
      • XnView MP
      • LibreOffice
      • xdotool
      • System Load Monitor
      • Battery Monitor
      • qBittorrent
    • Перетворення .RPM в .DEB
    • Bash
      • Конкатенация строк в Bash
      • Page
    • Файлові часові позначки в Linux: atime, mtime, ctime
    • Права доступу для файлів і каталогів
    • Зміна паролю root
    • Быстро удалить огромное количество файлов в каталоге
    • Як узнати версію Linux?
    • USB Flash ext4
    • Clear Cache
    • Доступ до спільної папки на Windows
    • Віртуальні консолі TTY1–TTY6
    • APT. Заборона оновлення
  • Різне
    • GitBook
    • Банковское округление
    • Ім’я користувача Youtube
  • Hard
    • Hardware
      • Acer Extensa
      • Таймер Feron TM22
      • WD My Book World Edition 2Tb
        • FTP
        • SSH
          • Проблеми
        • SSHFS
      • Canon PIXMA E3340
      • Термометри
    • Auto
      • Акумулятор
    • Electro
    • USB Flash recovery
Powered by GitBook
On this page
  • Расширение файла шаблона Jinja.
  • Переменные и выражения в шаблонах Jinja.
  • Использование фильтров в шаблонах Jinja.
  • Использование тестов в шаблонах Jinja.
  • Комментарии в шаблонах Jinja.
  • Управление пробелами в шаблонах Jinja.
  • Необрабатываемые блоки шаблонов Jinja.
  • Строчные операторы и комментарии в шаблонах.
  • Область с ограниченной видимостью в шаблоне Jinja.
  • Переопределение автоэкранирования HTML в шаблоне Jinja.
  1. Progr
  2. Python
  3. Модулі
  4. Jinja

Синтаксис шаблонів Jinja

PreviousJinjaNextКлас Environment()

Last updated 11 months ago

- это просто текстовый файл. может генерировать любой текстовый формат (HTML, XML, CSV, LaTeX и т. д.). Шаблон Jinja не обязательно должен иметь конкретное расширение: вполне подойдет .html, .xml или любое другое расширение.

Шаблон содержит переменные и/или выражения, которые заменяются значениями при визуализации шаблона, также применяются теги, управляющие логикой шаблона. Синтаксис шаблона во многом вдохновлен Django и Python.

Ниже приведен минимальный шаблон, который иллюстрирует некоторые основы использования конфигурации Jinja по умолчанию.

<!DOCTYPE html>
<html lang="en">
<head>
    <title>My Webpage</title>
</head>
<body>
    <ul id="navigation">
    {% for item in navigation %}
        <li><a href="{{ item.href }}">{{ item.caption }}</a></li>
    {% endfor %}
    </ul>

    <h1>My Webpage</h1>
    {{ a_variable }}

    {# a comment #}
</body>
</html>

В примере показаны параметры конфигурации по умолчанию. Разработчик приложения может изменить конфигурацию синтаксиса с {% foo %} на <% foo %> или что-то подобное.

Есть несколько видов разделителей. Разделители Jinja по умолчанию настроены следующим образом:

Содержание:


Расширение файла шаблона Jinja.

Как сказано выше, файл с любым расширением может быть загружен в качестве шаблона. Добавление расширения .jinja, такого как user.html.jinja, может облегчить работу некоторых IDE или плагинов, используемых редактором кода. Автоэкранирование HTML, может применяться на основе расширения файла, в этом случае необходимо будет учитывать дополнительный суффикс.

Еще одна хорошая эвристика для идентификации шаблонов заключается в том, что по умолчанию они находятся в папке templates, независимо от расширения. Это общий макет для проектов.

Переменные и выражения в шаблонах Jinja.

Переменные могут иметь атрибуты или элементы, к которым можно получить доступ в шаблонах. Какие атрибуты имеют переменные, сильно зависит от приложения, предоставляющего эту переменную.

В шаблонах можно использовать точку (.) для доступа к атрибутам переменной в дополнение к стандартному синтаксису индексирования ([]) в Python __getitem__().

Следующие строки делают одно и то же:

{{ foo.bar }}
{{ foo['bar'] }}

Если переменная или атрибут не существует в контексте шаблона, то на выходе получите неопределенное значение Undefined. То, что можно сделать с таким значением, зависит от конфигурации приложения: поведение по умолчанию значения Undefined это возврат пустой строки ''.

Реализация

Для удобства выражение foo.bar в Jinja выполняет следующие действия на слое Python:

  • проверяет наличие атрибута getattr(foo, 'bar'),

  • если нет, то проверяет наличие элемента foo.__getitem__('bar'),

  • если его нет, то возвращает неопределенный объект Undefined.

Выражение foo['bar'] работает в основном так же с небольшой разницей в последовательности:

  • проверяет наличие элемента foo.__getitem__('бар'),

  • если его нет, проверяет наличие атрибута getattr(foo, 'bar'),

  • если его нет, то возвращает неопределенный объект Undefined.

Использование методов, определенных для типа Python.

В шаблонах Jinja2 можно использовать любой из методов, определенных для типа переменной. Значение, возвращаемое при вызове метода, используется как значение выражения. Вот пример, в котором используются методы, определенные для строк, где page.title - это строка:

{{ page.title.capitalize() }}

Это работает для методов с пользовательскими типами. Например, если для переменной foo типа Foo определен метод bar, то можно сделать следующее:

{{ foo.bar(value) }}

Операторы Python работают также, как и ожидается. Например, оператор Python % реализует для строк стиль printf:

{{ "Hello, %s!" % name }}

Хотя в этом случае лучше использовать метод строки str.format(), который немного надуман в контексте рендеринга шаблона:

{{ "Hello, {}!".format(name) }}

Использование фильтров в шаблонах Jinja.

Переменные можно изменять с помощью фильтров. Фильтры отделяются от переменной вертикальной чертой (|) и могут иметь необязательные аргументы в круглых скобках. Можно объединить несколько фильтров. Выходные данные одного фильтра применяются к следующему.

Например, выражение шаблона {{ name|striptags|title }} удалит все HTML-теги из переменной name и напечатает все слова с заглавной буквы. Вызов последовательности фильтров будет следующим title(striptags(name)).

Фильтры, которые принимают аргументы, заключают аргументы в круглые скобки, как и при вызове функции Python. Например: выражение шаблона {{ listx|join(',') }} объединит список строк listx в одну строку, а в качестве разделителя будет использовать запятую ', '. Вызов фильтра будет следующим join(listx, ',').

В шаблонах jinja2 дополнительно можно использовать разделы фильтров, которые позволяют применять фильтры к блоку данных шаблона.

{% filter upper %}
    Этот текст становится прописным
{% endfilter %}

Использование тестов в шаблонах Jinja.

Тесты тоже могут принимать аргументы. Если тест принимает только один аргумент, то скобки можно опустить. Например, следующие два выражения делают одно и то же:

{% if loop.index is divisibleby 3 %}
{% if loop.index is divisibleby(3) %}

Комментарии в шаблонах Jinja.

Чтобы закомментировать часть строки в шаблоне, используйте синтаксис комментария, который по умолчанию установлен на {# ... #}. Это полезно, чтобы закомментировать части шаблона для отладки или добавить информацию для других разработчиков шаблона, а также для себя:

{# note: commented-out template because we no longer use this
    {% for user in users %}
        ...
    {% endfor %}
#}

Управление пробелами в шаблонах Jinja.

В конфигурации по умолчанию:

  • Один завершающий символ новой строки удаляется, если он присутствует.

  • Другие пробелы (пробелы, табуляции, новые строки и т. д.) возвращаются без изменений.

Если включены как trim_blocks, так и lstrip_blocks, то можно помещать теги блоков в их собственные строки, и вся строка блока будет удалена при рендеринге, сохраняя пробелы в содержимом. Например, без установленных аргументов trim_blocks и lstrip_blocks этот шаблон:

<div>
    {% if True %}
        Привет
    {% endif %}
</div>

Отображается с пустыми строками внутри div:

<div>

        Привет

</div>

Но при включенных аргументах trim_blocks и lstrip_blocks строки блока шаблона удаляются, а остальные пробелы сохраняются:

<div>
        Привет
</div>

Можно вручную отключить поведение lstrip_blocks, поставив знак плюса (+) в начале блока:

<div>
        {%+ if something %}Привет{% endif %}
</div>
{% for item in seq -%}
    {{ item }}
{%- endfor %}

Примечание: НЕ НАДО добавлять пробелы между тегом и знаком минус.

Правильная запись:
{%- if foo -%}...{% endif %}

НЕ правильная запись:
{% - if foo - %}...{% endif %}

Необрабатываемые блоки шаблонов Jinja.

Иногда желательно (даже необходимо) чтобы модуль Jinja игнорировал части, которые в противном случае обрабатывались как переменные или блоки. Например, если с синтаксисом по умолчанию необходимо использовать парные фигурные скобки {{ как необработанную строку в шаблоне, то самый простой способ это сделать - использовать выражение переменной {{ '{{' }}

Для больших разделов имеет смысл пометить блок как необработанный. Например, чтобы включить пример синтаксиса Jinja в шаблон, можно использовать фрагмент:

{% raw %}
    <ul>
    {% for item in seq %}
        <li>{{ item }}</li>
    {% endfor %}
    </ul>
{% endraw %}

Примечание. Знак минус в конце тега {% raw -%} очищает все пробелы и символы новой строки, предшествующие первому символу необработанных данных.

Строчные операторы и комментарии в шаблонах.

<ul>
# for item in seq
    <li>{{ item }}</li>
# endfor
</ul>

<ul>
{% for item in seq %}
    <li>{{ item }}</li>
{% endfor %}
</ul>

Префикс строки для оператора может появляться в любом месте строки, если ему не предшествует текст. Для удобства чтения операторы, которые начинают блок (например, for, if, elif и т. д.), могут заканчиваться двоеточием:

# for item in seq:
    ...
# endfor

Примечание. Строчные операторы могут охватывать несколько строк, если есть открытые круглые скобки (), фигурные скобки {} или квадратные скобки []:

<ul>
# for href, caption in [('index.html', 'Index'),
                        ('about.html', 'About')]:
    <li><a href="{{ href }}">{{ caption }}</a></li>
# endfor
</ul>

Начиная с Jinja 2.2, также доступны построчные комментарии. Например, если окружение Environment настроено с аргументом line_comment_prefix='##', то все от символов ## до конца строки игнорируется (за исключением знака новой строки):

# for item in seq:
    <li>{{ item }}</li>     ## Этот комментарий игнорируется
# endfor

Область с ограниченной видимостью в шаблоне Jinja.

Оператор шаблона with позволяет создать новую внутреннюю область видимости. Переменные, установленные в этой области, не видны за пределами области.

В двух словах:

{% with %}
    {% set foo = 42 %}
    {# здесь переменная `foo` будет равна 42 #}
    {{ foo }}
{% endwith %}
{# здесь переменная `foo` будет не определена #}

Так как обычно переменные устанавливаются в начале области видимости, это можно сделать с помощью оператора шаблона with. Следующие два примера эквивалентны:

{% with foo = 42 %}
    {{ foo }}
{% endwith %}

{% with %}
    {% set foo = 42 %}
    {{ foo }}
{% endwith %}

В версиях Jinja до 2.9 обращение одной переменной к другой имело непредвиденные последствия. В частности, одна переменная может ссылаться на другую, определенную в той же теге шаблона with, что вызвало проблемы и с тех пор было улучшено. В частности, в более новых версиях Jinja следующий код всегда ссылается на переменную a извне блока with:

{% with a={}, b=a.attribute %}...{% endwith %}

В более ранних версиях Jinja атрибут b будет относиться к результатам первого атрибута. Если код зависит от этого поведения, то можно переписать его, чтобы использовать тег шаблона set:

{% with a={} %}
    {% set b = a.attribute %}
{% endwith %}

Примечание. В более старых версиях Jinja до 2.9 требовалось включить эту функцию с помощью расширения. Теперь эта функциональность включена по умолчанию.

Переопределение автоэкранирования HTML в шаблоне Jinja.

При желании можно активировать и деактивировать автоматическое экранирование HTML прямо из шаблонов.

{% autoescape true %}
    В этом блоке активно автоэкранирование
{% endautoescape %}

{% autoescape false %}
    В этом блоке автоэкранирование неактивно
{% endautoescape %}

После блока autoescape поведение возвращается к тому, что было раньше.

Примечание. В более старых версиях Jinja до 2.9 требовалось включить эту функцию с помощью расширения. Теперь эта функциональность включена по умолчанию.

{% ... %} используется операторами шаблонов, такими как , , , и т.д.

{{ ... }} используется для написания для печати на выходе шаблона.

{# ... #} используется для , не включенных в выходные данные шаблона

# ... ## используется для .

;

;

;

;

;

;

;

;

;

;

;

.

Переменные шаблона определяются , переданным в шаблон при помощи метода .

Важно понимать, что внешние двойные фигурные скобки {{ ... }} не являются частью переменной, а являются частью оператора шаблона для вывода переменной/выражения на печать. Если нужно обратится к переменным внутри тегов {% ... %}, например при использовании в , то не заключайте переменные в фигурные скобки.

Это важно, если объект имеет элемент и атрибут с одинаковым именем. Кроме того, ищет только атрибуты.

Дополнительно смотрите с их описанием и примерами использования в шаблонах, а также как .

Помимо фильтров, доступны так называемые тесты. Тесты можно использовать для проверки переменной на соответствие общему выражению. Чтобы проверить , необходимо добавить после переменной is плюс имя теста. Например, чтобы узнать, определена ли переменная, можно написать что то на подобное name is defined, которое затем вернет истину или ложь в зависимости от того, определено ли name в текущем контексте шаблона.

Дополнительно смотрите с их описанием и примерами использования в шаблонах.

Если настроить модуль Jinja при , то первая новая строка после тега шаблона {% .. %} удаляется автоматически. Также в Environment может быть установлен аргумент lstrip_blocks для удаления табуляции и пробелов от начала строки до начала блока {% .. %} (ничего не будет удалено, если перед началом блока есть другие символы).

Также можно удалить пробелы в шаблонах вручную. Если добавить знак минус (-) в начало или конец блока (например, ), комментария или выражения переменной, то пробелы до или после этого блока будут удалены:

Эта разметка шаблона напечатает все элементы без пробелов между ними. Если бы переменная seq была чисел от 1 до 9, то на выходе было бы напечатано 123456789.

Если включены , то они автоматически удаляют начальные пробелы до начала строки.

По умолчанию Jinja также удаляет завершающие символы новой строки. Чтобы сохранить одиночные завершающие символы новой строки, настройте с аргументом keep_trailing_newline=True.

Если в приложении разрешены строчные операторы, то можно пометить строку как оператор. Например, если при инициализации , для аргумента line_statement_prefix задано значение '#', то следующие два примера эквивалентны:

Шаблон Jinja2
Модуль Jinja2
for/in
if/else
set
extend
выражений или переменными
написания комментариев
строчных операторов
Расширение файла шаблона Jinja
Переменные и выражения в шаблонах Jinja.
Использование методов, определенных для типа Python
Использование фильтров в шаблонах Jinja
Использование тестов в шаблонах Jinja
Комментарии в шаблонах Jinja
Управление пробелами в шаблонах Jinja
Необрабатываемые блоки в шаблонах Jinja
Использование строчных операторов и строчных комментариев в шаблонах
Строчные операторы и комментарии в шаблонах
Область с ограниченной видимостью в шаблоне Jinja
Переопределение автоэкранирования HTML в шаблоне Jinja
контекстным словарем
Template.render()
цикле шаблона {% for item in items %}
фильтр attr()
список всех встроенных фильтров
создать и зарегистрировать свои собственные фильтры
переменную или выражение
список всех встроенных тестов
создании Environment с аргументом trim_blocks
тега шаблона for/in
списком
строчные операторы
Environment
окружения Environment
https://docs-python.ru/packages/modul-jinja2-python/sintaksis-shablona-jinja2/