我无法弄清楚如何访问environment.filters
。在标准的Jinja2示例中,我可以看到 datetimeformat 过滤器的示例:
def datetimeformat(value, format='%H:%M / %d-%m-%Y'):
return value.strftime(format)
然后我们可以添加过滤器:
environment.filters['datetimeformat'] = datetimeformat
但我附加了django_jinja应用程序,现在使用django.shortcuts中的标准render_to_response
方法(Jinja的宏,内置函数 OK )。所以我的观点做出了这样的回应:
return render_to_response( html_template, result_dict )
我只包含了Jinja2应用程序,并且不担心构建自定义Jinja2响应,但我不知道如何访问环境。
使用django_jinja应用程序添加自定义模板过滤器应该更改什么?
答案 0 :(得分:5)
我用过这个......
jinja2.filters.FILTERS['datetimeformat'] = datetimeformat
希望这有帮助!
答案 1 :(得分:3)
我意识到这个问题相当陈旧但是我一直在寻找解决这个问题的方法,并且没有在SO上找到任何有用的答案,我想从django_jinja
文档中分享我的发现{ {3}}
有两种用例:
在Django项目settings.py
中全局注册过滤器。这可以在jinja2被指定为TEMPLATES
设置中的模板引擎时完成,例如
TEMPLATES = [
{
"BACKEND": "django_jinja.backend.Jinja2",
"APP_DIRS": True,
"OPTIONS": {
"match_extension": ".jinja",
"filters": {
"myfilter": "path.to.filters.myfilterfn",
...
}
}
}]
可以从here获取更多指定自定义扩展,上下文处理器等的详细信息。
在创建可重复使用的Django应用时注册特定于应用的过滤器。在这里,django_jinja再次通过让您将过滤器注册到全局过滤器库来实现救援,如下所示,
from django_jinja import library
@library.filter
def mylower(name):
"""
Usage: {{ 'Hello'|mylower() }}
"""
return name.lower()
更多详情this page
上述两个示例都已从django_jinja
文档中取消。使用2当然意味着django_jinja
是您的可重用应用程序的依赖项,但如果像我一样,您几乎可以在所有Django应用程序中使用Jinja模板,这不是什么大不了的事。
答案 2 :(得分:1)
如果我们希望它们存在于一个文件中,我们也会手动收集过滤器。更新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检索所有未以_
开头的函数。
答案 3 :(得分:0)
您可以使用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)