Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否将自定义筛选器定义嵌入jinja2模板?_Python_Templates_Plugins_Jinja2_Customization - Fatal编程技术网

Python 是否将自定义筛选器定义嵌入jinja2模板?

Python 是否将自定义筛选器定义嵌入jinja2模板?,python,templates,plugins,jinja2,customization,Python,Templates,Plugins,Jinja2,Customization,我正在编写一些Jinja2模板,希望能够在相关项目中尽可能轻松地重用这些模板。我有一套定制的便利过滤器,我希望模板可以随身携带。是否有Jinja2语法用于将过滤器定义嵌入模板本身?或者是一种将任何纯Python函数嵌入Jinja2模板的机制,该模板可以对传递到模板中的变量进行操作?我曾经使用mako,这样做很简单,但是在mako中使用LaTeX模板很痛苦,因为缺少自定义语法,所以我不得不进行切换。没有办法将python直接嵌入到Jinja2模板中,我所知道的方法是在应用程序中定义并将它们添加到J

我正在编写一些Jinja2模板,希望能够在相关项目中尽可能轻松地重用这些模板。我有一套定制的便利过滤器,我希望模板可以随身携带。是否有Jinja2语法用于将过滤器定义嵌入模板本身?或者是一种将任何纯Python函数嵌入Jinja2模板的机制,该模板可以对传递到模板中的变量进行操作?我曾经使用mako,这样做很简单,但是在mako中使用LaTeX模板很痛苦,因为缺少自定义语法,所以我不得不进行切换。

没有办法将python直接嵌入到Jinja2模板中,我所知道的方法是在应用程序中定义并将它们添加到Jinja2环境实例中。如下面的例子所示

这里是我使用的模板

{{ 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过滤器将任何给定字符串转换为布尔值。