Найти - Пользователи
Полная версия: Собственный фильтр, django + jinja2
Начало » Python для новичков » Собственный фильтр, django + jinja2
1
ppuser
Привет! вроде облазил весь гугл, есть информация о том, как создать свой кастомный фильтр в 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

но куда сохранять этот файл в структуре джанги и как подключать? подскажите пжл)
FishHook
У вас должна где-то в проекте быть функция возвращающая экземпляр 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
ppuser
да, при подключении 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’”,)
FishHook
Блин, а с какого суахили оно там появится то? Вот так сделай
 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
    
ppuser
Странно, я думал, что
 def environment(**options):
    env = Environment(**options)
    env.globals.update({
        'static': staticfiles_storage.url,
        'url': reverse,
    })
    return env
- это просто описание функции, а
 env = Environment();
env.filters['abovezero'] = do_abovezero
-вызов функции и создание экземпляра и порядок тут не важен.

Но Ваш вариант работает, спасибо за помощь!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB