金贾名单问题

时间:2016-05-17 12:08:13

标签: python dictionary jinja2

我在Jinja遇到了一个奇怪的问题,我有一个列表endpoints,其中包含每个endpoint的字典。在每个字典中,都有一个键tags,它是一个列表。 tags中的每个项目本身都是一个字典,其中键value给出了标记的标签。 endpoint可能有类似的标签。

endpoints对象的抽象表示示例可以是:

[ {"tags":[{"value":"car"},{"value":"place"}]} , {"tags":[{"value":"van"},{"value":"place"}]} ]

我想要的是简单地在div中显示唯一标签。它很简单,保留所有显示标签的列表,并在获得标签时检查它是否已经在列表中,如果没有显示它并将其添加到列表中。奇怪的是,它没有用。

代码是:

{% set tagValues = [] %}
{% for endpoint in endpoints %} 
        {% for tag in endpoint["tags"]%}
                {% set tagValue = tag["tag"]["value"] %}
                {% if tagValue not in tagValues %} 
                        {% set tagValues = tagValues  + [tagValue]  %}
                        <span >{{ tagValue }}</span></a>
                {% endif %}
        {% endfor %}
{% endfor %}

它不起作用,例如,对于上面的enpoints列表,我得到以下输出:

car place van place

代码有什么问题吗?

2 个答案:

答案 0 :(得分:1)

我的jinja知识是有限的,但是通过在输出中添加tagValues,它似乎在外循环的每次迭代后重置。我猜这与范围有关,但不知道。

我的建议是在传递给jinja之前在常规python中预处理你的endpoints

答案 1 :(得分:1)

我建议在视图中创建一个不同的标记列表。 e.g。

distinctTags = list(set([tag for endpoint in endpoints for tag in endpoint]))

并将其传递给您的模板

{% for tag in distinctTags %} 
    <span >{{ tagValue }}</span></a>
{% endfor %}

这样做的好处是可以重复使用不同的标记代码,而且代码的程序性较差。