【问题标题】:how to check keys variable exist and prevent printing line that key+value empty in jinja2 template如何检查键变量是否存在并防止在jinja2模板中打印键+值为空的行
【发布时间】:2017-03-30 03:23:06
【问题描述】:

我有 jinja2 模板,它以 'keys : value' 的形式从 yaml 获取数据变量。

问题是当我运行 jinja2 模板时,它会打印具有空“值”的行。

我该怎么做才能不打印空行。否则会显示为None。

例如;

-模板

set first {{ABC}}
set second {{DEF}}
set third {{GHI}}

-yaml 数据

ABC : data1
DEF :
GHI : data3

如果我运行它,它会声明;

set first data1
set second None
set third data3

我不希望这样。我希望它打印出来;

set first data1
set third data3

如何做到这一点?如果变量未定义,则防止添加行。

谢谢,

更新的脚本:-

TEMPLATE_FILE = { 'trial_1': 'trial.tcl' }
    for f,s in TEMPLATE_FILE.items():

    template = templateEnv.get_template( s )

    with open('tmp.yaml', 'rb') as stream:
        try:
            yaml_input_data = yaml.load(stream)
        except yaml.YAMLError as exc:
            pass
    print(yaml_input_data)

    for k, v in yaml_input_data.items():
        if v is None:
            yaml_input_data.pop(k)
    print(yaml_input_data)

    with open(f, 'w') as outfile:    
        outfile.writelines(template.render(yaml_input_data))
    print '\nWrote',f

更新 jinja2 模板

{% for k, v in yaml_input_data.iteritems() %}
    {# use k, v #}
set first {{ABC}}
set second {{DEF}}
set third {{GHI}}
{% endfor %}

【问题讨论】:

标签: python python-2.7 yaml jinja2


【解决方案1】:

您可以使用Jinja2 conditional blocks。

{% if ABC %}
set first {{ABC}}
{% endif %}
{% if DEF %}
set second {{DEF}}
{% endif %}
{% if GHI %}
set third {{GHI}}
{% endif %}

这将验证每个值是否存在。如果它不存在,则跳过该行,并且在给定的{%if%}{%endif%} 块内不写入任何内容。

【讨论】:

    【解决方案2】:

    您可以使用 Jinja 的 {% if variable %} 块 - @Jalepeno112 很好地回答了这个问题。但是,如果可能的话,我建议将 YAML 解析为 Python 中的字典之类的数据结构,然后使用 Jinja 模板中的数据结构。

    这将使您有机会在 python 中清理数据,然后仅发送存在的值。

    我在这里假设 YAML 正在通过 python 传递给 Jinja,因为您还在问题中添加了 python 标记。

    编辑 1: 有多种方法可以实现这一点,但添加一个简单的示例来说明我的意思。

    with open('tmp.yaml', 'r') as stream:
        try:
            yaml_input_data = yaml.load(stream)
        except yaml.YAMLError as exc:
            # handle error
            pass
    
    print(yaml_input_data)
    # {'ABC': 'data1', 'DEF': None, 'GHI': 'data3'}
    
    for k, v in yaml_input_data.items():
        if v is None:
            yaml_input_data.pop(k)
    
    # Now pass yaml_input_data to the Jinja template
    print(yaml_input_data)
    #{'ABC': 'data1', 'GHI': 'data3'}
    

    编辑2: 你能把 Jinja 模板改成这样吗?

    {% for k, v in yaml_input_data.iteritems() %}
        {# use k, v #}
    {% endfor %}
    

    【讨论】:

    • 是的,我也通过 import jinja2 和 yaml 使用 Python。那么,我该怎么做呢?
    • @k-rd 在答案中添加了我想建议的编辑 1 的示例
    • 无论如何,它仍然在模板中显示与未定义的'key'相对应的变量。我怎样才能得到输出,以便它只打印定义的键。例如:设置第一个数据1 设置第三个数据3
    • @k-rd 你能分享你的代码吗?我认为代码中存在一些错误,因为字典已更新并且不再具有不应显示在模板中的键
    • 我在这里添加了代码。模板中不显示该键,但该键对应的模板中的变量仍然显示。如果可以,我不希望它也显示变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 2015-07-25
    • 2022-01-10
    相关资源
    最近更新 更多