2014-08-27 110 views
3

我在Jinja2中的列表中包含了本身的dicts。像Jinja 2中列表的总和元素

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

有什么办法,我可以得到外循环的具有价值(循环中的最后一个值)?

+2

那种逻辑控制器中的所属,而不是模板。相应地预处理您的数据,并将'items'作为tell来传递给模板。 – 2014-08-27 10:47:58

+0

@LukasGraf也许你应该将其作为答案发布? – 2014-08-27 10:50:45

+0

@LukasGraf我完全同意你的看法,但在我的情况下,这会造成很大的混乱。 – Perun 2014-08-27 11:17:29

回答

4

我已经成功地使其工作,但解决方案是不优雅,但它的工作:

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

将阵列只是一个有求和元件。

它也可以通过包含扩展来完成,并且将取代{%if%}一行。

+0

旧的,但有用! – Roba 2015-10-21 12:11:59

2

这种逻辑通常应该放在控制器中,而不是模板(从逻辑演示中分离逻辑)。预处理你的数据相应,并通过项目,以及总的模板:

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])看到list comprehensions

+0

虽然这是一个很好的答案,而且我知道这可以通过这种方式来完成,但对于我的情况来说,它不会很好。将有几个支持值的字典,并有大量的代码。我想我已经找到了一个办法,如何做到这一点,需要多测试一下,如果它正在工作,会发布答案。 – Perun 2014-08-27 11:16:48

+0

然后你可能需要重构你的代码。你能编辑你的问题来包含你的代码和几个字典的例子吗? – 2014-08-27 11:20:23