Jinja 列表问题

Jinja List Issue

我在 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

代码有问题吗?

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

我的建议是在传递给 jinja

之前以常规方式 python 预处理您的 endpoints

我建议在您的视图中创建一个不同的标签列表。例如

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

并将其传递给您的模板

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

这样做的好处是独特的标签代码可以重复使用,而且代码的程序性较低。