避免在 Jinja2 模板中的一组 if+for 之后换行缩进
Avoid indentation on a newline after a set of if+for in a Jinja2 template
所以我有这个模板:
array (
{% if dict is defined %}
{% for key, value in dict.items() %}
'{{ key }}' => {{ value }},
{% endfor %}
{% endif %}
),
我知道我需要在某些 {% / %} 字符上附加破折号,但我找不到正确的组合。这是预期的结果:
array (
'key1' => value1,
'key2' => value2,
...
),
到目前为止,这是最接近我想要的组合:
array (
{% if dict is defined -%}
{% for key, value in dict.items() -%}
'{{ key }}' => {{ value }},
{% endfor -%}
{% endif -%}
),
结果:
array (
'key1' => value1,
'key2' => value2,
...
'keyN' => valueN,
), <- this should not be indented
请注意,我尝试了类似案例中提到的解决方案:
但对我也不起作用,导致整个输出都写在同一行上。
我尝试了更多的组合,但 none 到目前为止它们都有效,其中大多数导致所有 kay-value 对都写在同一行上。人群中有没有人对 Jinja 更有经验并且知道如何正确使用它?
为了实现这一点,您还必须使用 Jinja2 trim_blocks
环境参数。
此处在 debug
任务中进行了演示,但同样的注释行当然可以添加到任何 *.j2 处理的文件的开头template
模块。
所以神奇的评论行是:
#jinja2: trim_blocks:False
另请注意,为了降低控制空白的两个块的复杂性,我使用了 for ... if
结构。
所以根据剧本:
- hosts: all
gather_facts: no
tasks:
- debug:
msg: |
#jinja2: trim_blocks:False
array (
{%- for key, value in dict.items() if dict is defined %}
'{{ key }}' => {{ value }},
{%- endfor %}
),
vars:
dict:
lorem: ipsum
dolor: sit
这给出了输出:
PLAY [all] **********************************************************************************************************
TASK [debug] ********************************************************************************************************
ok: [localhost] => {
"msg": "array (\n 'lorem' => ipsum,\n 'dolor' => sit,\n),\n"
}
PLAY RECAP **********************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
所以我有这个模板:
array (
{% if dict is defined %}
{% for key, value in dict.items() %}
'{{ key }}' => {{ value }},
{% endfor %}
{% endif %}
),
我知道我需要在某些 {% / %} 字符上附加破折号,但我找不到正确的组合。这是预期的结果:
array (
'key1' => value1,
'key2' => value2,
...
),
到目前为止,这是最接近我想要的组合:
array (
{% if dict is defined -%}
{% for key, value in dict.items() -%}
'{{ key }}' => {{ value }},
{% endfor -%}
{% endif -%}
),
结果:
array (
'key1' => value1,
'key2' => value2,
...
'keyN' => valueN,
), <- this should not be indented
请注意,我尝试了类似案例中提到的解决方案:
但对我也不起作用,导致整个输出都写在同一行上。
我尝试了更多的组合,但 none 到目前为止它们都有效,其中大多数导致所有 kay-value 对都写在同一行上。人群中有没有人对 Jinja 更有经验并且知道如何正确使用它?
为了实现这一点,您还必须使用 Jinja2 trim_blocks
环境参数。
此处在 debug
任务中进行了演示,但同样的注释行当然可以添加到任何 *.j2 处理的文件的开头template
模块。
所以神奇的评论行是:
#jinja2: trim_blocks:False
另请注意,为了降低控制空白的两个块的复杂性,我使用了 for ... if
结构。
所以根据剧本:
- hosts: all
gather_facts: no
tasks:
- debug:
msg: |
#jinja2: trim_blocks:False
array (
{%- for key, value in dict.items() if dict is defined %}
'{{ key }}' => {{ value }},
{%- endfor %}
),
vars:
dict:
lorem: ipsum
dolor: sit
这给出了输出:
PLAY [all] **********************************************************************************************************
TASK [debug] ********************************************************************************************************
ok: [localhost] => {
"msg": "array (\n 'lorem' => ipsum,\n 'dolor' => sit,\n),\n"
}
PLAY RECAP **********************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0