Найти тему

Синтаксис Jinja для Django: Полный гайд

Оглавление

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 может помочь вам создавать более чистые, структурированные и расширяемые шаблоны, улучшая код вашего проекта.