Skip to main content
 首页 » 编程设计

python之在 Jinja for 循环中设置变量不会在迭代之间持续存在

2025年05月04日25xing901022

我想遍历一个对象列表并计算有多少对象满足要求。我的代码基于我发现的其他示例,但它不起作用,循环后计数始终为 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 是有意义的。