将自定义过滤器定义嵌入到jinja2模板中?

时间:2014-08-22 14:51:32

标签: python templates plugins jinja2 customization

我正在编写一些Jinja2模板,我希望能够在切向相关项目中尽可能轻松地重复使用。我有一套自定义便利过滤器,我喜欢模板来随身携带"跟他们。是否有用于将过滤器定义嵌入模板本身的Jinja2语法?或者是一种将任何类型的纯Python函数嵌入到Jinja2模板中的机制,该模板可以作用于传递给模板的变量?我曾经使用mako,并且在那里做这件事是微不足道的,但是由于缺乏自定义语法,在mako中模板化LaTeX很痛苦,所以我不得不进行切换。

2 个答案:

答案 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']]

如果您有更复杂的用例,请在下面发表评论。我很乐意回答您的所有问题。