Jinja 2中对列表元素求和

14

我在Jinja2中有一个包含字典的列表,类似于:

items = [{'name':'name1', 'points':5}, {'name':'name2', 'points':7}, 
 {'name':'name3', 'points':2}, {'name':'name4', 'points':11}]

我需要的是获得所有点数的总和,然后在稍后的某个地方打印出来。

目前我拥有的是:

{% set points = 0 -%}
{% for single_item in items -%}
    {% set points = points + single_item["points"] -%}
    {{points}}
{% endfor %}
{{ points }}

结果是:5 12 14 25 0

我是否有办法在循环之外获取那些分数,并且其中的值为25(循环的最后一个值)?


2
那种逻辑应该放在控制器中,而不是模板中。预处理您的数据,并将“items”和“total”作为参数传递给模板。 - Lukas Graf
@LukasGraf 或许你应该将那个作为一个答案发表? - Sylvain Leroux
@LukasGraf 我完全同意你的观点,但在我的情况下,这会造成很大的混乱。 - Perun
4个回答

48

4
应该接受这个答案。虽然比被接受的答案更简洁,但它仍能正常工作。 - TheWhiteLlama

3

这种逻辑通常应该放在控制器中,而不是模板中(将逻辑与呈现分离)。相应地预处理数据,并将项目以及总数传递到模板:

from jinja2 import Template

template = Template(open('index.html').read())

items = [{'name': 'name1', 'points': 5},
         {'name': 'name2', 'points': 7},
         {'name': 'name3', 'points': 2},
         {'name': 'name4', 'points': 11}]

total = sum([i['points'] for i in items])

print template.render(items=items, total=total)

index.html:

<table>

{% for item in items %}
  <tr>
    <td>{{ item.name }}</td>
    <td>{{ item.points }}</td>
  </tr>
{% endfor %}

</table>

<strong>Total:</strong>{{ total }}

关于表达式sum([i['points'] for i in items])的详细信息,请参见列表推导式


1
虽然这是一个好答案,我知道可以这样做,但对于我的情况来说,它不会很好地工作。我将有几个带有支持值的字典,并且代码将变得非常混乱。我认为我已经找到了一种方法来解决这个问题,需要进一步测试,如果它有效,我会发布答案。 - Perun
那么你可能需要重构你的代码。你能否编辑你的问题,包括你的代码示例和几个字典? - Lukas Graf

3
我已经设法使其工作,虽然解决方案并不优雅,但它确实可以工作:

{% set points = [0] -%}
{% for single_item in items -%}
    {% if points.append(points.pop()+ single_item["points"]) -%}{% endif %}
{% endfor %}
{{ points }}

points是一个只有一个元素的数组,其中包含总和。

也可以使用内置的do扩展来完成,这将替换{% if %}行。


1
这不是最好的答案。 - caspii

-1

来源:https://linuxtut.com/en/129012d5539a8724556d/

解决方案2:使用命名空间 <2019/12/21:来自na90ya> 似乎在jinja2的2.10版本中引入的命名空间对象中使用时可以保留变量。(参考材料[1])

count_test3.j2

{%- set ns = namespace(cnt=1) -%}
{%- for i in range(3) -%}
{%- set ns.cnt = ns.cnt + 1 -%}
{{ ns.cnt }}
{% endfor -%}
result : {{ ns.cnt }}

但我还没有尝试过...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接