如何使用django_jinja创建Jinja2自定义过滤器?
我不知道怎么访问 environment.filters
。在标准的 Jinja2 示例中,我看到有一个 datetimeformat 过滤器的例子:
def datetimeformat(value, format='%H:%M / %d-%m-%Y'):
return value.strftime(format)
然后我们可以添加这个过滤器:
environment.filters['datetimeformat'] = datetimeformat
但是我使用了 django_jinja 应用,现在用的是 Django 自带的 render_to_response
方法(Jinja 的宏和内置函数都能正常工作)。所以我的视图返回的是这样的响应:
return render_to_response( html_template, result_dict )
我只包含了 Jinja2 应用,也不担心构建自定义的 Jinja2 响应,但我不知道怎么访问环境。
我应该怎么改才能在 django_jinja 应用中添加一个自定义模板过滤器呢?
这里是这个应用的描述: https://pypi.python.org/pypi/django-jinja/0.8。
4 个回答
你可以使用 django-jinja 来轻松实现这个功能:
在 <someapp>/templatetags/<anyfile>.py
文件中,你只需要这样做:
from django_jinja import library
@library.filter
def datetimeformat(value, format='%H:%M / %d-%m-%Y'):
return value.strftime(format)
我们还手动收集过滤器,如果我们希望它们都放在一个文件里。更新 JINJA2_FILTERS 字典(通常放在 settings.py 文件里):
# settingsutils.py
import filters # our file of filters
import inspect
def collect_j2_filters( JINJA2_FILTERS ):
""" Collects JINJA2 filters
"""
exclude_prefix = '_'
funcs = inspect.getmembers( filters, inspect.isfunction )
for f in funcs:
name = f[ 0 ]
callable = f[ 1 ]
if name.find( exclude_prefix ) != 0: # filter function is found
JINJA2_FILTERS.update( { name[ len_prefix: ]: callable } )
# settings.py
from settingsutils import collect_j2_filters
JINJA2_FILTERS = {}
collect_j2_filters( JINJA2_FILTERS )
之后,我们可以把所有的过滤器函数放到主项目目录下的 filters.py 文件里。collect_js_filters 会获取所有没有以 _
开头的函数。
我知道这个问题已经有点旧了,但我在网上找解决办法的时候没有找到什么有用的答案,所以想分享一下我从 django_jinja
的文档中了解到的内容,详细信息可以在这里找到。
这里有两种使用场景:
在你的Django项目的
settings.py
文件中全局注册过滤器。这可以在TEMPLATES
设置中指定使用 jinja2 作为模板引擎时完成,比如:TEMPLATES = [ { "BACKEND": "django_jinja.backend.Jinja2", "APP_DIRS": True, "OPTIONS": { "match_extension": ".jinja", "filters": { "myfilter": "path.to.filters.myfilterfn", ... } } }]
更多细节,包括如何指定自定义扩展、上下文处理器等,可以在这一页找到。
在创建可重用的Django应用时注册特定于应用的过滤器。在这里,
django_jinja
也能帮上忙,让你可以将过滤器注册到全局过滤器库,方法如下:from django_jinja import library @library.filter def mylower(name): """ Usage: {{ 'Hello'|mylower() }} """ return name.lower()
更多细节可以在这里找到。
以上两个例子都是直接引用自 django_jinja
的文档。使用第二种方法当然意味着 django_jinja
是你可重用应用的一个依赖,但如果你像我一样,几乎所有的Django应用都使用Jinja模板,这其实也没什么大不了的。
我用了这个...
jinja2.filters.FILTERS['datetimeformat'] = datetimeformat
希望这对你有帮助!