Добавление пользовательского фильтра Jinja2 в GAE 1.6.0 - PullRequest
2 голосов
/ 07 ноября 2011

Я бы хотел добавить фильтр для форматирования своего времени, и лучшими были бы фильтры типа timesince django, которые автоматически выводят язык выбранного языка i18n, но сначала для быстрого решения я хотел бы отформатировать мойДата. предлагаемое решение из руководства :

def datetimeformat(value, format='%H:%M / %d-%m-%Y'):
    return value.strftime(format)

jinja_environment.filters['datetimeformat'] = datetimeformat

Но добавление этого кода в мой файл не делает фильтр доступным в шаблоне:

{{ ad.modified|datetimeformat }}
TemplateAssertionError: no filter named 'datetimeformat'

Если я добавлю код в библиотеку Jinja2 filters.py, он будет работать.Но мне не нужно добавлять файлы Jinja2 вручную, это должно сработать, просто добавив Jinja2 в мой app.yaml и вставив мой фильтр в мой код, а не в код Jinja2.Куда я должен поместить код фильтра?

Спасибо

Обновление

Мой код выглядит следующим образом, и кажется, что фильтр не выбран:

from django.utils import translation
from django.utils.translation import gettext, ngettext, ugettext, ungettext, get_language, activate
from jinja2 import Environment, FileSystemLoader

class DjangoTranslator(object):
    def __init__(self):
        self.gettext = gettext
        self.ngettext = ngettext
        self.ugettext = ugettext
        self.ungettext = ungettext

class DjangoEnvironment(jinja2.Environment):
    def get_translator(self, context):
        return DjangoTranslator()

jinja_environment = DjangoEnvironment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)), extensions=['jinja2.ext.i18n'])
jinja_environment.install_gettext_translations(translation)

def datetimeformat(value, format='%H:%M / %d-%m-%Y'):
    return value.strftime(format)

jinja_environment.filters['datetimeformat'] = datetimeformat

Ответы [ 2 ]

4 голосов
/ 09 января 2013

Следуя вашему примеру и Документация Jinja2 Я добавил пользовательский фильтр, и он работает.Убедитесь, что вы используете правильный jinja2.Environment экземпляр для получения шаблона и рендеринга:

env = jinja2.Environment(
    loader=jinja2.FileSystemLoader(template_path))
env.filters['default_if_none'] = default_if_none  # a function
tmpl = env.get_template(filename)
tmpl.render(**context)
2 голосов
/ 11 марта 2013

Поскольку я использовал кэшированную среду jinja2 в соответствии с рекомендациями здесь ,

Ответ Ки не сработал для меня, но этот сработал.

В частности, добавление фильтра при вызове webapp2.WSGIApplication

myconfig = {}
myconfig['webapp2_extras.jinja2'] =  {'template_path': ['templates','blog_posts'],
                                      'filters': {'blog_filter': blog_filter}}

app = webapp2.WSGIApplication(_routes,
    debug=True,
    config = myconfig)
...