递增变量时重置Jinja for循环范围


问题内容

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


问题答案:

Jinja2模板参考中所述,这确实是一个范围界定问题:

作用域行为

请记住,无法在块内设置变量并使变量显示在块外。这也适用于循环。

[…]

从版本2.10开始,可以使用namespace允许跨范围传播更改的对象来处理更复杂的用例[。]

因此,您可以使用namespace()该类作为变通方法:

{% 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()过滤器对这些数量求和:

{% for line in current_order.order_lines %} #loops twice in current test
    <!-- render order line -->
{% endfor %}

{{ current_order.order_lines|sum(attribute='quantity') }}