Фильтры в шаблонах Django представляют собой специальные функции, используемые для форматирования данных перед выводом их в шаблоне.Используются для выполнения различных операций над переменными в шаблоне, таких как форматирование строк, изменение регистра, обрезка текста и другие.
|
(pipe), за которым следует название фильтра и его аргументы, если таковые имеются.
Аргументы для фильтров передаются напрямую после имени фильтра, разделённые двоеточием, без пробела!{{ variable|filter:arg }}
Цепочки фильтров:
{{ variable|filter1|filter2 }}
Django предоставляет ряд встроенных фильтров для решения общих задач форматирования данных.
Фильтры из лекции (описание из документации):
add
capfirst
lower
upper
cut
first
last
length
default
divisibleby
join
slugify
В Django можно определять собственные пользовательские фильтры для выполнения специфических операций над данными.
Создание папки templatetags
:
templatetags
на том же уровне, что и models.py
, views.py
и т.д. Если он еще не существует, создайте его - не забудьте про файл __init__.py
, чтобы каталог воспринимался как пакет Python.Создание Python-модуля:
templatetags
создайте файл с расширением .py
(например, custom_filters.py
).<aside>
📌 Сервер не перезапускается автоматически!
После добавления модуля templatetags
вам нужно перезапустить сервер,
прежде чем вы сможете использовать теги или фильтры в шаблонах.
</aside>
Определение фильтра:
custom_filters
определите функцию или несколько функций, которые будут являться вашими фильтрами.template
из Django.template.Library()
.register.filter
from django import template
register = template.Library()
# можно задать имя с помощью аргумента name
@register.filter(name='db2')
def divide_by_2(value):
try:
return int(value) // 2
except ValueError:
return 0
# или не указывать имя, тогда по умолчанию будет использовано имя функции
@register.filter
def add_string(value, arg):
return value + arg
Использование в шаблонах:
{% load custom_filters %}
, где custom_filters
- это имя файла без расширения....
{% load custom_filters %}
<h1>{{ title }}</h1>
<p>{{ number|db2 }}</p>
<p>{{ test|add_string:' for you' }}</p>
...
В некоторых случаях, возможно использовать фильтры в качестве функций в Python-коде, но это не является общепринятой практикой и может считаться неудачным дизайном. Вместо этого, лучше создавать функции, которые делают необходимые операции, и вызывать их там, где это необходимо.
Пример того, как можно использовать фильтры в качестве функций в Python:
from django.template.defaultfilters import slugify
def custom_function(value):
# Используем фильтр slugify
return slugify(value)
# Пример использования
result = custom_function("Some random text")
print(result) # Выведет: "some-random-text"
Хотя это может работать, это не рекомендуется, так как это нарушает принципы разделения ответственности и ухудшает читаемость кода.