Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 19, 2016 13:39:30

ppuser
Зарегистрирован: 2016-10-18
Сообщения: 4
Репутация: +  0  -
Профиль  

Собственный фильтр, django + jinja2

Привет! вроде облазил весь гугл, есть информация о том, как создать свой кастомный фильтр в jinja2, но не могу понять, как его подключить?

нашел что-то подобное:

 from jinja2 import Environment, Undefined
def custom_sort(iterable, somearg):
    if iterable is None or isinstance(iterable, Undefined):
        return iterable
    # Do custom sorting of iterable here
    return iterable
# ...
env = Environment()
env.filters['customsort'] = custom_sort

но куда сохранять этот файл в структуре джанги и как подключать? подскажите пжл)

Офлайн

#2 Окт. 19, 2016 14:12:38

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Собственный фильтр, django + jinja2

У вас должна где-то в проекте быть функция возвращающая экземпляр environment
https://docs.djangoproject.com/en/1.10/topics/templates/#django.template.backends.jinja2.Jinja2
вот в этом экземпляре все настройки и надстройки jinja, смотрите сюда
http://jinja.pocoo.org/docs/dev/api/#writing-filters
вы пишите функцию фильтра и подключаете её к environment как элемент словаря environment.filters



Офлайн

#3 Окт. 20, 2016 10:18:26

ppuser
Зарегистрирован: 2016-10-18
Сообщения: 4
Репутация: +  0  -
Профиль  

Собственный фильтр, django + jinja2

да, при подключении jinja я создавал файл jinja2.py в директории на одном уровне с settings.py
там прописываю

 from django.contrib.staticfiles.storage import staticfiles_storage
from django.core.urlresolvers import reverse
from jinja2 import Environment
def environment(**options):
    env = Environment(**options)
    env.globals.update({
        'static': staticfiles_storage.url,
        'url': reverse,
    })
    return env
    
    
def do_abovezero(value):
    return 0
    
env = Environment();
env.filters['abovezero'] = do_abovezero
print(env.filters)

распечатываю фильтры, там мой добавился, среди нативных фильтров есть:
“abovezero” : <function do_abovezero at 0x000…>

но в темплейте выдает ошибку при использовании {{ “testTest”|abovezero }}

TemplateSyntaxError (“no filter named ‘abovezero’”,)

Офлайн

#4 Окт. 20, 2016 13:30:34

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Собственный фильтр, django + jinja2

Блин, а с какого суахили оно там появится то? Вот так сделай

 def do_abovezero(value):
    return 0
def environment(**options):
    env = Environment(**options)
    env.globals.update({
        'static': staticfiles_storage.url,
        'url': reverse,
    })
    env.filters['abovezero'] = do_abovezero
    return env
    



Офлайн

#5 Окт. 28, 2016 06:48:17

ppuser
Зарегистрирован: 2016-10-18
Сообщения: 4
Репутация: +  0  -
Профиль  

Собственный фильтр, django + jinja2

Странно, я думал, что

 def environment(**options):
    env = Environment(**options)
    env.globals.update({
        'static': staticfiles_storage.url,
        'url': reverse,
    })
    return env
- это просто описание функции, а
 env = Environment();
env.filters['abovezero'] = do_abovezero
-вызов функции и создание экземпляра и порядок тут не важен.

Но Ваш вариант работает, спасибо за помощь!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version