首页 > 解决方案 > Jinja2:自定义过滤器布尔标志

问题描述

我试图在这里跟进这个例子:

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

但我不想做上弦,而是做一个布尔标志。

在我的 jinja2 模板中,我想要这样的东西:

{{ set | remediate }} /etc/network/interfaces

如果修复标志设置为 false,我希望它打印“设置”。当我渲染时,预期的输出是:

set /etc/network/interfaces

如果修复标志设置为 true,则渲染时不会打印“设置”:

/etc/network/interfaces

使用链接中的示例,有没有一种方法可以将布尔标志传递给函数,以便当我使用env.filters['remediate'] = remediate它定义它时,它将确定渲染时是否输出“设置”?

渲染配置.py

from render import render

def main():
  flag = False
  render(flag)

渲染.py

def render(flag):

   import jinja2

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

   env.filters['remediate'] = remediate
   temp = env.get_template('test.jinja2')
   temp.render(set='set')

def remediate(flag):
   """Custom filter"""
   return flag

标签: pythonpython-3.xjinja2

解决方案


我设法编写了一个对我有用的解决方案。我使用了上面链接示例中的相同概念,但修改为评估布尔标志:

def remediate(input):
    """Custom filter"""
    if with_remediate == True:
        return input
    else:
        return ''

在我的 Jinja2 模板文件中,我有这样的东西..

{{ set | remediate }} /etc/network/interfaces

如果某个函数正在调用模板的渲染过程,则布尔标志可以设置为 True 或 False - 取决于您要实现的目标。在我的特殊情况下,上面的模板是指与网络设备相关的一些配置。显示配置时,'set' 字符串不存在。但是,要配置该行,必须包含“set”。两种不同的功能,两种不同的用途,一种模板。

在您的 render() 函数中,您将拥有如下内容:

config = baseline.render(set = 'set ')

这是为了让 Jinja2 知道传递给 remediate 的值 'set' 等于字符串 'set'。


推荐阅读