Skip to content

Latest commit

 

History

History
219 lines (154 loc) · 8.99 KB

File metadata and controls

219 lines (154 loc) · 8.99 KB

Модуль 2. Урок 9. Стандартные шаблонные фильтры в Django

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


1. Что такое фильтры

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

Например, если у нас есть название фильма в нижнем регистре "inception", мы можем сделать его с заглавной буквы прямо в шаблоне — без изменения кода в views.py.


2. Как применять фильтры

Синтаксис фильтров в Django очень прост: в шаблоне после переменной ставится вертикальная черта (|), а затем указывается имя фильтра.

<p>{{ title|upper }}</p>

Если фильтр принимает аргумент, он передаётся через двоеточие ::

<p>{{ number|add:"10" }}</p>

В этом примере фильтр add прибавит к переменной number значение 10.


3. Пример на основе проекта CinemaHub

Создадим представление 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 в строку через запятую.

Проверка результата

  1. Запусти сервер:

    python manage.py runserver
  2. Перейди на страницу http://127.0.0.1:8000/.

Ты должен увидеть:

CINEMAHUB
Каталог фильмов и сериалов
Средний рейтинг фильма: 8.9
Жанры: драма, фантастика, комедия

4. Ещё несколько полезных фильтров

Фильтр Назначение Пример использования
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 }}`

5. Использование фильтра slugify в Python-коде

Фильтры можно использовать не только в шаблонах, но и в 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

6. Ключи с пробелами в словарях

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


7. Проверка результата

После перезапуска сервера и обновления страницы мы увидим, например:

Interstellar — 9.0  
Oppenheimer — 8.8  
The Dark Knight — 9.1

Вопросы

  1. Что делает шаблонный фильтр в Django?
  2. Какой символ используется для применения фильтра к переменной?
  3. Как передать аргумент фильтру?
  4. Как работает фильтр add?
  5. Что делает фильтр capfirst?
  6. Как вывести длину списка в шаблоне?
  7. Как фильтр join работает со списками?
  8. Почему нельзя написать {{ ratings.The Dark Knight }}?
  9. Как можно вывести словарь с ключами, содержащими пробелы?
  10. Можно ли использовать фильтры Django в Python-коде, а не только в шаблонах?

Предыдущий урок | Следующий урок