【问题标题】:Embed custom filter definition into jinja2 template?将自定义过滤器定义嵌入到 jinja2 模板中?
【发布时间】:2014-10-16 11:26:31
【问题描述】:

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

【问题讨论】:

  • 你想为你的 jinja 定义一个过滤器文件吗?

标签: python templates plugins jinja2 customization


【解决方案1】:

NO可以将 python 直接嵌入到 Jinja2 模板中,我知道的方法是在您的应用程序中定义并将它们添加到您的 Jinja2 环境实例中。就像下面这个取自https://jinja.palletsprojects.com/en/2.11.x/api/#writing-filters的例子一样。

import jinja2

loader = jinja2.FileSystemLoader('/tmp')
env = jinja2.Environment(autoescape=True, loader=loader)

def upperstring(input):
    """Custom filter"""
    return input.upper()

env.filters['upperstring'] = upperstring
temp = env.get_template('template.html')
temp.render(name="testing")

这里是我使用的模板

{{ name | upperstring }}

结果是这样的

TESTING

【讨论】:

  • 知道如何删除所有旧过滤器吗?
  • 如果您的意思是删除所有现有的 default 过滤器,您可以通过执行 env.filters = {}env.filters 简单地替换为空字典。但是不确定为什么要这样做。
  • 抱歉,我指的是所有旧的“自定义”过滤器。但是我发现 Jinja 环境明确设置了基本过滤器,所以不能分配给空字典。
  • @flazzarini 你如何调用upperstring并输入变量“input”?如果我想要一个布尔值的自定义过滤器,我如何返回我传入的变量 true/false?
  • 不确定我是否正确理解了您的问题,但是如果您想定义一个返回布尔类型的过滤器,您可以编写 here 以使用 jinja2 将任何给定字符串转换为布尔值过滤器。
【解决方案2】:

有一种简单的方法可以在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']]

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

【讨论】:

    猜你喜欢
    • 2021-09-21
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 2021-02-24
    • 2011-05-28
    • 2011-03-29
    • 2012-06-07
    相关资源
    最近更新 更多