我正在编写一些Jinja2模板,我希望能够在切向相关项目中尽可能轻松地重复使用。我有一套自定义便利过滤器,我喜欢模板来随身携带"跟他们。是否有用于将过滤器定义嵌入模板本身的Jinja2语法?或者是一种将任何类型的纯Python函数嵌入到Jinja2模板中的机制,该模板可以作用于传递给模板的变量?我曾经使用mako,并且在那里做这件事是微不足道的,但是由于缺乏自定义语法,在mako中模板化LaTeX很痛苦,所以我不得不进行切换。
答案 0 :(得分:17)
有 NO 方式可以直接将python嵌入到Jinja2模板中,我知道的方法是在应用程序中定义并将它们添加到Jinja2环境实例中。如下面的例子http://jinja.pocoo.org/docs/dev/api/#writing-filters。
import jinja2
loader = jinja2.FileSystemLoader('/tmp')
env = jinja2.Environment(autoescape=True, loader=loader)
def upperstring(input):
return input.upper()
env.filters['upperstring'] = upperstring
temp = env.get_template('template.html')
temp.render(name="testing")
这里是我正在使用的模板
{{ name | upperstring }}
结果就是这个
TESTING
答案 1 :(得分:6)
有一种在 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"}]}))
输出
['Overflow', 'Stack']
[['Overflow', 'Stack'], ['Exchange', 'Stack']]
如果您有更复杂的用例,请在下面发表评论。我很乐意回答您的所有问题。