宏不返回Jinja2中的列表吗?

时间:2018-08-31 11:24:10

标签: python-2.7 jinja2

在我的Jinja2代码中,宏getLisCustomer()用于获取返回的客户ID列表,其定义如下:

{% macro getLisCustomer() %}
    {% set myList = [] %}
    {% if myList.append('CU001') %}{% endif %}
    {% if myList.append('CU002') %}{% endif %}
    {% if myList.append('CU003') %}{% endif %}
{{myList}}
{% endmacro %}

但是,当我尝试从宏getLisCustomer()获取单个客户ID时,我得到的是单个字符的列表,而不是列表中的单个客户ID。

{% set TotalList = getLisCustomer() %}
{% for row in TotalList %}
    <p>{{row}}</p>
{% endfor %}

结果是这样的[ ' C U 0 0....

怎么了?如何从Jinja2的宏getLisCustomer()中获取列表元素?

已添加:我刚刚意识到根本原因可能是我的宏未返回列表,而是返回了类似列表的字符串,这就是在for-loop中返回每个字符的原因列表元素。因此,如何将类似列表的字符串转换为实际列表?

1 个答案:

答案 0 :(得分:0)

您可以像使用逗号分隔的列表表示一样简单,在使用时将其拆分为列表:

{% macro getLisCustomer() -%}
    {% set myList = [] -%}
    {% if myList.append('CU001') %}{% endif -%}
    {% if myList.append('CU002') %}{% endif -%}
    {% if myList.append('CU003') %}{% endif -%}
{% for i in myList %}{{ i }}{% if not loop.last %},{% endif %}{% endfor -%}
{% endmacro %}

这可以进一步简化,因为您实际上不需要创建myList,因此可以立即打印这些值。

然后:

{% set TotalList = getLisCustomer().split(',') -%}
{% for row in TotalList %}
    <p>{{row}}</p>
{%- endfor %}

或者如果出于某种原因想要实现数据交换协议,则可以在Python中创建自定义过滤器(基于Ansible扩展Jinja2的方式查看我的first edit)。