使用Jinja2统计同名事件数量时计数错误如何解决
Jinja2同名事件计数异常问题解决
错误原因
你原有代码计数异常的核心原因是Jinja2的块级作用域限制:普通set定义的变量无法在嵌套的for循环内部修改后同步到外层作用域,你在内层循环里写的{% set count = count + 1 %}本质是创建了一个内层局部的count变量,根本没有修改外层初始化的count值,因此循环结束后外层count始终为初始值0,无法得到正确统计结果。
解决方法
方法1:使用namespace跨作用域修改变量(适配原有逻辑)
Jinja2 2.10及以上版本支持namespace对象,其属性可以跨作用域修改,不会被内层作用域隔离,适配你原有写法的修改后代码如下:
{% for event in events %} {% set counter = namespace(count=0) %} <tr> <td>{{ event.name }}</td> {% for ticket in tickets %} {% if ticket.event_name == event.name %} {% set counter.count = counter.count + 1 %} {% endif %} {% endfor %} <td>{{ counter.count }}</td> </tr> {% endfor %}
方法2:使用内置过滤器简化实现(更高效)
直接用Jinja2内置的selectattr过滤器筛选匹配的ticket,再用length获取数量,无需手动写循环计数,代码更简洁性能也更好:
{% for event in events %} <tr> <td>{{ event.name }}</td> <td>{{ tickets | selectattr("event_name", "equalto", event.name) | list | length }}</td> </tr> {% endfor %}
内容的提问来源于stack exchange,提问作者maxiflo
相关产品推荐
相关产品推荐

