Header Image

Python Django - фильтры шаблонов

Загружено/обновлено 14 Ноября 2016

Создание модуля templatetags

Первое что нужно сделать, это создать модуль templatetags в приложении, а затем разместить в нем файл __init__.py. Или можносделать отдельное приложение специально для фильтров и/или тегов. В таком случае, нужно обязательно его зарегистрировать в settings.py.

Следующий шаг - создать файл myfilters.py в модуле templatetags. Имя файло может быть любым, но оно бедет в последствие использовано в шаблонах. Затем нужно импортировать модуль template и инстанциировать декоратор. При использовании декоратора нужно указать опцию safe. Если установить её в True то Django не будет эскейпить вывод, так что будте осторожны и в боевых условиях всегда проверяйте html перед выводом.

from django import template

register = template.Library()

@register.filter(safe=True)
def mysite_link(publisher):
    if publisher == "Me":
            return '<a href="http://mysite.com">%s</a>' % publisher
    else:
            return publisher

Использовать фильтр следует так: {{ article.publisher | mysite_link }}. Однако перед этим, в начале шаблона, нужно включить директиву {% load myfilters %}. Причем имя myfilters не случайно - именно так мы назвали наш файл с функциями фильтров.

Рассмотрим ещё один пример, но на этот раз с параметром. Во всё том же myfilters.py:

@register.filter(is_safe=True):
def youtube_embed(url, hd=False):
    if hd:
          get_youtube_hd_embed(url):
    else:
       return get_youtube_sd_embed(url): 

Этот фильтр работает вот так: {{ video_link|youtube_embed "True" }}