我想遍历一个对象列表并计算有多少对象满足要求。我的代码基于我发现的其他示例,但它不起作用,循环后计数始终为 0。
对于每栋房子,我想遍历每个房间并计算有多少个房间有床。我想输出然后重置下一个房子的计数。
{% for house in city %}
{% set count = 0 %}
<div>{{ house.address }} has {{ count }} beds in it rooms.</div>
{% for room in house %}
{% if room.has_bed == True %}{% set count = count + 1 %}{% endif %}
{% endfor %}
{% endfor %}
请您参考如下方法:
Jinja 2.10 引入了 namespace对象来处理循环中的赋值和比较。
{% set ns = namespace(beds=0) %}
{% for room in house %}
{% if room.has_bed %}
{% set ns.beds = ns.beds + 1 %}
{% endif %}
{% endfor %}
{{ house.address }} has {{ ns.beds }} beds.
通常,set 不处理属性,这就是为什么旧的答案改为使用方法来改变对象。 namespace 已被特殊区分,因此设置属性确实有效。
原始计数器不起作用的原因是 Jinja 的 scope rules .与 Python 不同,大多数 block 都是新范围。 set 总是定义局部变量,namespace.attribute 的这个新特例除外。
在这种特定情况下,您可以使用过滤器完成您想要的。
{% set beds = house.rooms|selectattr('has_bed')|length %}
{{ house.address }} has {{ beds }} beds.
但是,有些情况下需要跨范围存储信息。例如,如果除了递增计数器之外还想输出一些信息,那么使用 namespace 是有意义的。
