Jinja2 — это один из мощных шаблонизаторов для Python и отличный выбор для тех, кто хочет больше гибкости и возможностей в шаблонах, чем стандартный шаблонизатор Django. Он поддерживает фильтры, циклы, блоки, макросы и много других полезных инструментов для работы с HTML.
Основной синтаксис Jinja
Переменные
Для вывода переменной в шаблоне используется следующий синтаксис:
{{ переменная }}
Пример: <p>Привет, {{ user.username }}!</p>
Фильтры
Фильтры позволяют изменять данные прямо в шаблоне перед выводом. Вот пример использования фильтра для преобразования текста в верхний регистр:
{{ переменная|upper }}
Часто используемые фильтры:
upper
— переводит строку в верхний регистр.lower
— переводит строку в нижний регистр.length
— возвращает длину списка или строки.default
— задает значение по умолчанию, если переменнаяNone
.
Пример использования: <p>Количество элементов: {{ items|length }}</p>
Циклы
Jinja поддерживает циклы для итерации по спискам:
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
Также есть дополнительные возможности для работы с циклами:
loop.index
— текущий индекс (начинается с 1).loop.first
— возвращаетTrue
, если это первый элемент.loop.last
— возвращаетTrue
, если это последний элемент.
Пример:
<ul>
{% for post in posts %}
<li>
{{ post.title }}
{% if loop.first %}(Первый пост!){% endif %}
</li>
{% endfor %}
</ul>
Условные операторы
Условные конструкции позволяют выводить информацию на основе определённых условий:
{% if user.is_authenticated %}
<p>Привет, {{ user.username }}!</p>
{% else %}
<p>Привет, гость!</p>
{% endif %}
Можно использовать и более сложные условия с elif
:
{% if user.is_superuser %}
<p>Добро пожаловать, администратор!</p>
{% elif user.is_staff %}
<p>Привет, сотрудник!</p>
{% else %}
<p>Привет, пользователь!</p>
{% endif %}
Наследование шаблонов
Одной из мощных возможностей Jinja является поддержка наследования шаблонов. Это позволяет создавать базовые шаблоны, которые могут быть расширены в дочерних. Например, у нас может быть базовый шаблон:
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}Мой сайт{% endblock %}</title>
</head>
<body>
<header>
{% block header %}<h1>Заголовок сайта{% endblock %}</h1>
</header>
<main>
{% block content %}{% endblock %}
</main>
<footer>
{% block footer %}Мой футер{% endblock %}
</footer>
</body>
</html>
А теперь в дочернем шаблоне мы можем переопределить блоки title
, header
и content
:
{% extends 'base.html' %}
{% block title %}Главная страница{% endblock %}
{% block header %}
<h1>Добро пожаловать на главную страницу!</h1>
{% endblock %}
{% block content %}
<p>Это контент главной страницы.</p>
{% endblock %}
Макросы
Jinja поддерживает макросы, которые позволяют переиспользовать фрагменты кода в разных местах шаблона, что удобно для повторяющихся элементов, например, форм.
Пример макроса для рендеринга полей формы:
{% macro render_field(field) %}
<div class="form-group">
<label for="{{ field.id }}">{{ field.label }}</label>
{{ field }}
</div>
{% endmacro %}
Вызываем макрос так: {{ render_field(form.username) }}
Включение шаблонов
Шаблоны могут включать другие шаблоны с помощью тега include
. Это полезно, если вам нужно вставить повторяющийся HTML-код, например, меню или хэдер:
{% include 'partials/navbar.html' %}
Комментарии
Если нужно оставить комментарий в коде, который не будет выведен на страницу, можно использовать следующий синтаксис:
{# Это комментарий #}
Комментарий будет проигнорирован при рендеринге шаблона.
Заключение
Jinja — это мощный инструмент для работы с шаблонами в Django. Он поддерживает гибкий синтаксис, быстрый рендеринг и множество полезных функций, таких как макросы и наследование. Благодаря этому Jinja2 может помочь вам создавать более чистые, структурированные и расширяемые шаблоны, улучшая код вашего проекта.
Написать комментарий