在GAE 1.6.0中添加自定义Jinja2过滤器

2 投票
2 回答
2137 浏览
提问于 2025-04-17 05:48

我想给我的时间格式添加一个过滤器,最理想的情况是像Django的timesince那样的过滤器,它可以自动根据选择的语言输出内容。不过,首先为了快速解决问题,我想先格式化我的日期。手册中推荐的解决方案是:

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 个回答

2

因为我按照推荐的方式使用了一个缓存的 jinja2 环境,具体可以参考 这里

Kee 的回答对我没有用,但 这个回答对我有效。

具体来说,就是在调用 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)
4

根据你的例子和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)

撰写回答