На прошлом уроке мы научились передавать данные из представлений в шаблоны и выводить их в HTML. Теперь пора сделать эти данные красивыми и удобными для восприятия. В Django для этого существуют фильтры — специальные инструменты, которые позволяют изменять отображение данных прямо в шаблоне, не трогая логику Python-кода.
Фильтры — это простейшие функции, встроенные в Django, которые изменяют значение переменной перед её отображением.
Например, если у нас есть название фильма в нижнем регистре "inception", мы можем сделать его с заглавной буквы прямо в шаблоне — без изменения кода в views.py.
Синтаксис фильтров в Django очень прост:
в шаблоне после переменной ставится вертикальная черта (|), а затем указывается имя фильтра.
<p>{{ title|upper }}</p>Если фильтр принимает аргумент, он передаётся через двоеточие ::
<p>{{ number|add:"10" }}</p>В этом примере фильтр add прибавит к переменной number значение 10.
Создадим представление index в views.py:
def index(request):
data = {
'title': 'cinemahub',
'description': 'каталог фильмов и сериалов',
'rating': 8.4,
'genres': ['драма', 'фантастика', 'комедия'],
}
return render(request, 'movies/index.html', data)Теперь создадим шаблон index.html:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>{{ title|capfirst }}</title>
</head>
<body>
<h1>{{ title|upper }}</h1>
<p>{{ description|capfirst }}</p>
<p>Средний рейтинг фильма: {{ rating|add:"0.5" }}</p>
<p>Жанры: {{ genres|join:", " }}</p>
</body>
</html>capfirst— делает первую букву заглавной. →"cinemahub"превращается в"Cinemahub".upper— делает все буквы заглавными. →"cinemahub"превращается в"CINEMAHUB".add:"0.5"— прибавляет число 0.5 к рейтингу.join:", "— объединяет элементы спискаgenresв строку через запятую.
-
Запусти сервер:
python manage.py runserver
-
Перейди на страницу
http://127.0.0.1:8000/.
Ты должен увидеть:
CINEMAHUB
Каталог фильмов и сериалов
Средний рейтинг фильма: 8.9
Жанры: драма, фантастика, комедия
| Фильтр | Назначение | Пример использования | ||
|---|---|---|---|---|
lower |
Преобразует строку в нижний регистр | `{{ title | lower }}` | |
cut:" " |
Удаляет указанный символ | `{{ title | cut:" " }}` | |
default:"Не указано" |
Задаёт значение по умолчанию | `{{ director | default:"Неизвестен" }}` | |
divisibleby:"2" |
Проверяет, делится ли число на 2 | `{% if number | divisibleby:"2" %} Чётное {% endif %}` | |
length |
Возвращает длину списка или строки | `{{ genres | length }}` | |
first / last |
Первый и последний элемент коллекции | `{{ genres | first }}, {{ genres |
last }}` |
slugify |
Создаёт slug из строки (удаляет пробелы и спецсимволы) | `{{ title | slugify }}` |
Фильтры можно использовать не только в шаблонах, но и в Python.
Они находятся в модуле django.template.defaultfilters.
from django.template.defaultfilters import slugify
def index(request):
data = {
'title': 'The Dark Knight',
'url': slugify("The Dark Knight"),
}
return render(request, 'movies/index.html', data)Теперь в шаблоне:
<p>Slug фильма: {{ url }}</p>Результат:
Slug фильма: the-dark-knight
В прошлом уроке мы создавали словарь ratings:
'ratings': {'Interstellar': 9.0, 'Oppenheimer': 8.8, 'The Dark Knight': 9.1}Попробуем вывести рейтинг фильма с пробелом в названии:
<p>Рейтинг The Dark Knight: {{ ratings.The Dark Knight }}</p>Это не сработает! Шаблонизатор Django воспримет
ratings.Theкак обращение к атрибутуThe, а не к ключу'The Dark Knight'. В итоге — пустое место на странице.
Для этого используется фильтр dictsort или специальный синтаксис с фильтром get.
В шаблонах Django можно вызывать метод .get через фильтр |default_if_none, но более надёжный способ — написать так:
<p>Рейтинг The Dark Knight: {{ ratings|get_item:"The Dark Knight" }}</p>Чтобы это заработало, нужно зарегистрировать фильтр get_item.
Добавь в проект кастомный фильтр в файле templatetags/custom_tags.py (мы подробно разберём создание фильтров в одном из следующих уроков).
Но пока для проверки можно обойтись иначе: выведи все элементы словаря в цикле:
{% for name, value in ratings.items %}
<p>{{ name }} — {{ value }}</p>
{% endfor %}Таким образом, Django корректно покажет все фильмы, даже если в названии есть пробелы.
После перезапуска сервера и обновления страницы мы увидим, например:
Interstellar — 9.0
Oppenheimer — 8.8
The Dark Knight — 9.1
- Что делает шаблонный фильтр в Django?
- Какой символ используется для применения фильтра к переменной?
- Как передать аргумент фильтру?
- Как работает фильтр
add? - Что делает фильтр
capfirst? - Как вывести длину списка в шаблоне?
- Как фильтр
joinработает со списками? - Почему нельзя написать
{{ ratings.The Dark Knight }}? - Как можно вывести словарь с ключами, содержащими пробелы?
- Можно ли использовать фильтры Django в Python-коде, а не только в шаблонах?