{{ ... }}
):
* Используются для отображения данных, переданных из Python-кода в шаблон.
* Доступ к атрибутам объекта осуществляется через точку (.
) или квадратные скобки ([]
).
* Пример:
html+jinja
<h1>Привет, {{ user.name }}!</h1>
<p>Ваш email: {{ user['email'] }}</p>
{% ... %}
):
* Используются для выполнения логических операций, таких как циклы и условные операторы.
* Условные операторы (if
, elif
, else
):
html+jinja
{% if user.is_logged_in %}
<p>Добро пожаловать!</p>
{% elif user.has_pending_notifications %}
<p>У вас есть непрочитанные уведомления.</p>
{% else %}
<p>Пожалуйста, войдите.</p>
{% endif %}
* Циклы (for
):
html+jinja
<ul>
{% for item in items %}
<li>{{ item.name }} - {{ item.price }}</li>
{% empty %}
<li>Список товаров пуст.</li>
{% endfor %}
</ul>
* loop
контекстная переменная внутри цикла:
* loop.index
: Текущий индекс (начиная с 1).
* loop.index0
: Текущий индекс (начиная с 0).
* loop.first
: True, если это первая итерация.
* loop.last
: True, если это последняя итерация.
* loop.length
: Общее количество элементов.
* loop.revindex
: Количество оставшихся элементов (начиная с 1).
* loop.revindex0
: Количество оставшихся элементов (начиная с 0).
* Наследование шаблонов (extends
, block
):
* extends
: Указывает на родительский шаблон, который будет расширен.
* block
: Определяет области в родительском шаблоне, которые могут быть переопределены в дочерних шаблонах.
* Родительский шаблон (base.html
):
html+jinja
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}Мой сайт{% endblock %}</title>
</head>
<body>
<div class="content">
{% block content %}{% endblock %}
</div>
<div class="footer">
{% block footer %}© 2023 Мой сайт{% endblock %}
</div>
</body>
</html>
* Дочерний шаблон (index.html
):
html+jinja
{% extends 'base.html' %}
{% block title %}Главная страница{% endblock %}
{% block content %}
<h1>Добро пожаловать на главную страницу!</h1>
<p>Это содержимое главной страницы.</p>
{% endblock %}
* Включения (include
):
* Вставляет содержимое другого шаблона в текущий шаблон.
* Полезно для повторного использования фрагментов HTML.
* Пример:
html+jinja
<div>
{% include 'navigation.html' %}
</div>
{{ variable | filter }}
):
* Модифицируют значения переменных перед их отображением.
* Применяются с помощью символа |
.
* Можно применять несколько фильтров последовательно ({{ variable | filter1 | filter2 }}
).
* Примеры встроенных фильтров:
* capitalize
: Преобразует первую букву в заглавную, остальные в строчные.
* lower
: Преобразует строку в нижний регистр.
* upper
: Преобразует строку в верхний регистр.
* title
: Преобразует первую букву каждого слова в заглавную.
* trim
: Удаляет пробелы с начала и конца строки.
* striptags
: Удаляет HTML/XML теги.
* length
: Возвращает длину последовательности или строки.
* default(value)
: Возвращает указанное значение, если переменная неопределена.
* join(separator)
: Объединяет элементы последовательности в строку с указанным разделителем.
* sort
: Сортирует последовательность.
* format(value, ...)
: Форматирует строку с использованием оператора %
.
* replace(old, new)
: Заменяет все вхождения подстроки old
на new
.
* Пример использования фильтров:
html+jinja
<p>{{ message | capitalize }}</p>
<p>Количество элементов: {{ items | length }}</p>
<p>Цена: {{ price | default('Бесплатно') }}</p>
<p>Имена: {{ names | join(', ') }}</p>
{% if variable is test %}
):
* Используются для проверки типа или состояния переменной.
* Применяются с помощью ключевого слова is
.
* Примеры встроенных тестов:
* defined
: Проверяет, определена ли переменная.
* undefined
: Проверяет, не определена ли переменная.
* none
: Проверяет, является ли переменная None
.
* number
: Проверяет, является ли переменная числом.
* string
: Проверяет, является ли переменная строкой.
* boolean
: Проверяет, является ли переменная булевым значением.
* iterable
: Проверяет, является ли переменная итерируемым объектом.
* lower
: Проверяет, является ли строка в нижнем регистре.
* upper
: Проверяет, является ли строка в верхнем регистре.
* Пример использования тестов:
html+jinja
{% if user.age is number and user.age >= 18 %}
<p>Совершеннолетний</p>
{% else %}
<p>Несовершеннолетний</p>
{% endif %}
{% if items is iterable and items | length > 0 %}
<ul>
{% for item in items %}
<li>{{ item.name }}</li>
{% endfor %}
</ul>
{% else %}
<p>Нет элементов.</p>
{% endif %}
{# ... #}
):
* Используются для добавления комментариев в шаблон, которые не отображаются в выходном документе.
* Пример:
html+jinja
{# Это комментарий, который не будет виден в HTML #}
<p>Отображаемый текст.</p>
{% macro name(param1, param2='default') %}
):
* Позволяют определять многократно используемые фрагменты шаблонов (похожи на функции).
* Могут принимать аргументы.
* Импортируются с помощью import
или from ... import ...
.
* Определение макроса:
html+jinja
{% macro render_user(user) %}
<div>
<h3>{{ user.name }}</h3>
<p>Email: {{ user.email }}</p>
</div>
{% endmacro %}
* Использование макроса:
html+jinja
{% from 'macros.html' import render_user %}
{{ render_user(current_user) }}
bash
pip install Jinja2
python
from jinja2 import Environment, FileSystemLoader
Environment
):
* Загрузчик (FileSystemLoader
) указывает, где искать файлы шаблонов.
python
env = Environment(loader=FileSystemLoader('.')) # Искать шаблоны в текущей директории
# Или указать конкретную папку:
env = Environment(loader=FileSystemLoader('templates'))
get_template()
):
python
template = env.get_template('index.html')
render()
):
* Передача данных в шаблон в виде словаря.
python
context = {
'user': {'name': 'Иван', 'email': 'ivan@example.com', 'is_logged_in': True},
'items': [{'name': 'Яблоко', 'price': 1.0}, {'name': 'Банан', 'price': 0.5}]
}
rendered_html = template.render(context)
print(rendered_html)
<
, >
, &
, '
, "
) для предотвращения XSS-атак.| safe
фильтр): Используйте с осторожностью для переменных, которые вы абсолютно уверены, что содержат безопасный HTML.
html+jinja
<div>{{ user.formatted_description | safe }}</div>
| safe
: Только когда это действительно необходимо и вы уверены в безопасности HTML-содержимого.Jinja является мощным инструментом для динамического формирования текстового контента в Python-приложениях. Понимание его синтаксиса и основных возможностей позволяет создавать гибкие, читаемые и безопасные шаблоны, эффективно разделяя логику представления от бизнес-логики.