问题描述
我无法弄清楚如何访问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的宏,内置函数工作正常 )。
所以我的观点得到了这样的回应
return render_to_response( html_template, result_dict )
我只包括Jinja2应用程序,不用担心构建自定义Jinja2响应,但我不知道如何访问环境。
使用django_jinja应用程序添加自定义模板过滤器应该更改什么?
以下是该应用程序的说明: : 。
1楼
我用过这个......
jinja2.filters.FILTERS['datetimeformat'] = datetimeformat
希望这可以帮助!
2楼
我意识到这个问题相当陈旧,但是我一直在寻找解决这个问题的方法,并且没有找到任何有用的答案,我想分享我的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
文档中解除的。
使用2当然意味着django_jinja
是你的可重用应用程序的依赖项,但如果像我一样,你几乎所有的Django应用程序都使用Jinja模板,这不是什么大不了的事。
3楼
如果我们希望它们存在于一个文件中,我们也会手动收集过滤器。 更新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检索所有不以_
开头的函数。
4楼
您可以使用轻松完成此操作:
在<someapp>/templatetags/<anyfile>.py
您只需执行此操作
from django_jinja import library
@library.filter
def datetimeformat(value, format='%H:%M / %d-%m-%Y'):
return value.strftime(format)