我在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
代码有什么问题吗?
答案 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 %}
这样做的好处是可以重复使用不同的标记代码,而且代码的程序性较差。