在GAE 1.6.0中添加自定义Jinja2过滤器
我想给我的时间格式添加一个过滤器,最理想的情况是像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)