Python 是否将自定义筛选器定义嵌入jinja2模板?
我正在编写一些Jinja2模板,希望能够在相关项目中尽可能轻松地重用这些模板。我有一套定制的便利过滤器,我希望模板可以随身携带。是否有Jinja2语法用于将过滤器定义嵌入模板本身?或者是一种将任何纯Python函数嵌入Jinja2模板的机制,该模板可以对传递到模板中的变量进行操作?我曾经使用mako,这样做很简单,但是在mako中使用LaTeX模板很痛苦,因为缺少自定义语法,所以我不得不进行切换。没有办法将python直接嵌入到Jinja2模板中,我所知道的方法是在应用程序中定义并将它们添加到Jinja2环境实例中。如下面的例子所示 这里是我使用的模板Python 是否将自定义筛选器定义嵌入jinja2模板?,python,templates,plugins,jinja2,customization,Python,Templates,Plugins,Jinja2,Customization,我正在编写一些Jinja2模板,希望能够在相关项目中尽可能轻松地重用这些模板。我有一套定制的便利过滤器,我希望模板可以随身携带。是否有Jinja2语法用于将过滤器定义嵌入模板本身?或者是一种将任何纯Python函数嵌入Jinja2模板的机制,该模板可以对传递到模板中的变量进行操作?我曾经使用mako,这样做很简单,但是在mako中使用LaTeX模板很痛苦,因为缺少自定义语法,所以我不得不进行切换。没有办法将python直接嵌入到Jinja2模板中,我所知道的方法是在应用程序中定义并将它们添加到J
{{ name | upperstring }}
结果是这样的
TESTING
有一种简单的方法可以在
jinja2
模板中添加自定义过滤器。
FILTERS
是包含所有可用于呈现模板的过滤器的字典。
但是,我们可以添加更多的过滤器
from jinja2 import Template
from jinja2.filters import FILTERS, environmentfilter
@environmentfilter
def do_reverse_by_word(environment, value, attribute=None):
"""
custom max calculation logic
"""
if attribute:
return [list(reversed(i.get(attribute).split())) for i in value]
return list(reversed(value.split()))
FILTERS["reverse_by_word"] = do_reverse_by_word
print(Template("{{ name | reverse_by_word }}").render({"name": "Stack Overflow"}))
print(Template("{{ names | reverse_by_word(attribute='name') }}").render({"names": [{"name": "Stack Overflow"}, {"name": "Stack Exchange"}]}))
下面是一个向其中添加新过滤器的快速示例
from jinja2 import Template
from jinja2.filters import FILTERS, environmentfilter
@environmentfilter
def do_reverse_by_word(environment, value, attribute=None):
"""
custom max calculation logic
"""
if attribute:
return [list(reversed(i.get(attribute).split())) for i in value]
return list(reversed(value.split()))
FILTERS["reverse_by_word"] = do_reverse_by_word
print(Template("{{ name | reverse_by_word }}").render({"name": "Stack Overflow"}))
print(Template("{{ names | reverse_by_word(attribute='name') }}").render({"names": [{"name": "Stack Overflow"}, {"name": "Stack Exchange"}]}))
输出
['Overflow', 'Stack']
[['Overflow', 'Stack'], ['Exchange', 'Stack']]
如果您有更复杂的用例,请在下面进行评论。我很乐意回答你的所有问题。你想为你的jinja定义一个过滤器文件吗?你知道如何删除所有旧的过滤器吗?如果你想删除所有现有的默认过滤器,你可以通过执行
env.filters={}
简单地用一个空字典替换env.filters
。不知道为什么要这样做。对不起,我指的是所有旧的“自定义”过滤器。但是我发现Jinja环境显式地设置了基本过滤器,所以不能分配给空字典。@flazzarini如何调用upperstring并输入变量“input”?如果我想要一个布尔型自定义过滤器,我如何返回传入的变量true/false?不确定我是否正确理解您的问题,但如果您想定义一个返回布尔型的过滤器,您可以编写一些东西,使用jinja2过滤器将任何给定字符串转换为布尔值。