递增变量时,将重置Jinja for loop scope

时间:2018-02-22 20:07:57

标签: python flask jinja2

我正在构建一个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循环中增加一个值?

1 个答案:

答案 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') }}