我正在构建一个Flask应用程序,并尝试循环显示订单行以显示一个篮子中的项目数量。
{% set items = 0 %}
{% for line in current_order.order_lines %} #loops twice in current test
{% set items = items + line.quantity %} #should add 5 then 2
{% endfor %}
{{ items }} #outputs 0
经过一些研究后我发现它是一个范围问题,即底部{{ items }}
看不到我已经添加了5然后2.如何在Jinja for循环中增加一个值?
答案 0 :(得分:6)
这确实是一个范围问题,如documented in the Jinja2 template reference:
范围行为
请记住,无法在块内设置变量并将其显示在块外。这也适用于循环。
[...]
从版本2.10开始,可以使用
namespace
对象处理更复杂的用例,这些对象允许跨范围传播更改[。]
所以你可以使用namespace()
class作为解决方法:
{% set ns = namespace(items=0) %}
{% for line in current_order.order_lines %}
{% set ns.items = ns.items + line.quantity %}
{% endfor %}
{{ ns.items }}
也就是说,如果您事先计算项目数 并将其作为current_order
对象的一部分或其他项目传递到模板中,则更好上下文。
另一种选择是使用sum()
filter对这些数量求和:
{% for line in current_order.order_lines %} #loops twice in current test
<!-- render order line -->
{% endfor %}
{{ current_order.order_lines|sum(attribute='quantity') }}