JavaRush /Курсы /Модуль 3: Django /Основные теги и фильтры Django Template Language (DTL)

Основные теги и фильтры Django Template Language (DTL)

Модуль 3: Django
5 уровень , 3 лекция
Открыта

В этой лекции мы поговорим об одном из самых практичных и мощных инструментов Django Template Language — тегах и фильтрах. С их помощью вы сможете не просто отображать данные, но и преобразовывать их так, как требуется вашим пользователям. Готовы? Погружаемся глубже в DTL!

Что такое теги и фильтры в DTL?

Теги в Django Template Language — это команды, которые выполняют определённые действия внутри шаблона. Представьте их как маленьких помощников, которые решают задачки на лету. Например, вам нужно отобразить список объектов, но только те, у которых определённое значение фильтра. Или настроить логику отображения HTML-кода — тут вам помогут теги.

Их синтаксис заключается в использовании фигурных скобок с процентами:

{% название_тега аргументы %}

Фильтры — это «фабрика преобразований»

Фильтры — это способы изменения данных перед их отображением. Если вы хотите уменьшить длину строки, форматировать дату или обрезать текст — это работа для фильтров. Они применяются к переменной через вертикальную черту:

{{ переменная|фильтр }}

Теги в DTL

{% for %}: циклы — основа повторений

Если у вас есть список данных, и вы хотите пройтись по нему и отобразить каждый элемент, то ваш лучший друг — это {% for %}.

Пример:

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

Это создаст HTML-список, в котором каждый <li> будет содержать один элемент из items.

Но и это ещё не всё. Вы можете использовать встроенные переменные внутри цикла, например:

{% for item in items %}
    {{ forloop.counter }}: {{ item }}
{% endfor %}
  • forloop.counter — текущий номер итерации (начинается с 1).
  • forloop.counter0 — то же самое, но с 0.
  • forloop.firstTrue для первого элемента.
  • forloop.lastTrue для последнего элемента.

{% if %}: условия в шаблонах

А вот и наш любимый условный оператор. С ним вы можете управлять отображением данных.

Пример:

{% if user.is_authenticated %}
    <p>Привет, {{ user.username }}!</p>
{% else %}
    <p>Вы не авторизованы. Пожалуйста, войдите в систему.</p>
{% endif %}

Вы также можете комбинировать условия:

{% if items|length > 5 %}
    <p>Длинный список!</p>
{% elif items|length == 0 %}
    <p>Список пуст.</p>
{% else %}
    <p>Нормальный список.</p>
{% endif %}
Обратите внимание на фильтр |length, который возвращает длину списка.

{% block %} и {% extends %}: основы наследования шаблонов

Эти теги помогут вам строить иерархию шаблонов и переиспользовать код.

  • {% block %} используется для определения «блоков», которые могут быть переопределены в дочерних шаблонах.
  • {% extends %} позволяет наследовать другой шаблон.

Пример:

<!-- base.html -->
<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}Базовый заголовок{% endblock %}</title>
</head>
<body>
    {% block content %}{% endblock %}
</body>
</html>>
<!-- child.html -->
{% extends "base.html" %}

{% block title %}Страница пользователя{% endblock %}

{% block content %}
    <p>Добро пожаловать на страницу пользователя!</p>
{% endblock %}

{% include %}: вставка других шаблонов

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

Пример:

{% include "navbar.html" %}

Фильтры в DTL

truncatechars: обрезка строк

Не хотите, чтобы строка занимала слишком много места? Используйте truncatechars!

Пример:

{{ заголовок|truncatechars:20 }}

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

date: форматирование дат

Работа с датами в шаблонах упрощается при помощи фильтра date.

Пример:

{{ дата|date:"d M Y" }}

Это преобразует дату в формат 12 Oct 2023.

default: значение по умолчанию

Если переменная — пустая, вы можете указать значение по умолчанию с помощью фильтра default.

Пример:

{{ имя|default:"Гость" }}

length: длина списка

Как вы видели раньше, length возвращает количество элементов в списке.

Пример:

p
{% if список|length > 10 %}
    <p>Слишком длинный список!</p>
{% endif %}

lower и upper: регистры

Хотите преобразовать строку в нижний или верхний регистр? Вам помогут фильтры lower и upper.

Пример:

{{ текст|lower }}
{{ текст|upper }}

Создаем свои фильтры

Иногда вам может понадобиться что-то уникальное, как собственный фильтр! Это более сложный процесс, и он реализуется с помощью Python функции и декоратора @register.filter. Например, фильтр, который добавляет восклицательный знак к строке:

from django import template

register = template.Library()

@register.filter
def add_exclamation(value):
    return f"{value}!"

Затем в шаблоне:

{{ "Привет"|add_exclamation }}

И вот вам наше "Привет!"

Примеры использования тегов и фильтров

Пример 1: список задач

<h1>Список задач</h1>
<ul>
    {% for task in tasks %}
        <li>
            {% if task.completed %}
                <s>{{ task.name }}</s>
            {% else %}
                {{ task.name }}
            {% endif %}
        </li>
    {% endfor %}
</ul>

Пример 2: динамическое меню

<ul>
    {% for link in menu %}
        <li>
            <a href="{{ link.url }}">{{ link.title|upper }}</a>
        </li>
    {% endfor %}
</ul>

Разрешение типичных ошибок

На первых порах вы можете столкнуться с проблемами при работе с тегами и фильтрами. Например, одной из распространённых ошибок является попытка вызвать метод объекта с круглыми скобками (например, {{ объект.метод() }}). В Django шаблонах методы не вызываются напрямую! Вы можете либо передавать результат метода в контекст, либо использовать готовые атрибуты объекта.

Другой распространённой ошибкой является использование тегов вне пар {% %} или фильтров без вертикальной черты |. Если вдруг получаете непонятные ошибки в шаблоне — дважды проверьте синтаксис.

Практическая работа

Попробуйте самостоятельно:

  1. Написать шаблон для отображения списка новостей, где каждая новость показывается с обрезанным (до 50 символов) текстом.
  2. Реализовать шаблон страницы профиля, используя теги {% if %} для проверки, авторизован ли пользователь.
  3. Поиграйтесь с другими фильтрами, например, yesno или default_if_none.

Если вы прошли все примеры, то постепенно начинаете осваивать магию DTL. Дальше вас ждёт еще больше возможностей для создания профессиональных веб-приложений!

1
Задача
Модуль 3: Django, 5 уровень, 3 лекция
Недоступна
Применение фильтров к спискам и строкам
Применение фильтров к спискам и строкам
1
Задача
Модуль 3: Django, 5 уровень, 3 лекция
Недоступна
Комбинация циклов, фильтров и условий
Комбинация циклов, фильтров и условий
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ