В этой лекции мы поговорим об одном из самых практичных и мощных инструментов 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.first—Trueдля первого элемента.forloop.last—Trueдля последнего элемента.
{% 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 шаблонах методы не вызываются напрямую! Вы можете либо передавать результат метода в контекст, либо использовать готовые атрибуты объекта.
Другой распространённой ошибкой является использование тегов вне пар {% %} или фильтров без вертикальной черты |. Если вдруг получаете непонятные ошибки в шаблоне — дважды проверьте синтаксис.
Практическая работа
Попробуйте самостоятельно:
- Написать шаблон для отображения списка новостей, где каждая новость показывается с обрезанным (до 50 символов) текстом.
- Реализовать шаблон страницы профиля, используя теги
{% if %}для проверки, авторизован ли пользователь. - Поиграйтесь с другими фильтрами, например,
yesnoилиdefault_if_none.
Если вы прошли все примеры, то постепенно начинаете осваивать магию DTL. Дальше вас ждёт еще больше возможностей для создания профессиональных веб-приложений!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ