Jinja 2中列表的元素

时间:2014-08-27 10:44:23

标签: python jinja2

我在Jinja2中列出了包含dicts的列表。像

这样的东西
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 (循环中的最后一个值)?

3 个答案:

答案 0 :(得分:17)

Jinja2包含一个和过滤器,可以为您执行此操作:

{{ items | sum(attribute='points') }}

请参阅此处的文档:http://jinja.pocoo.org/docs/dev/templates/#sum

答案 1 :(得分:4)

我已经设法使它工作,虽然解决方案不优雅,但它正在工作:

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

points 将只包含一个具有sum的元素。

也可以使用包含执行扩展名来完成,这将取代{%if%}行。

答案 2 :(得分: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