问题
I have list in Jinja2 that contain dicts in itself. Something like
items = [{'name':'name1', 'points':5}, {'name':'name2', 'points':7},
{'name':'name3', 'points':2}, {'name':'name4', 'points':11}]
What I need is to get sum of all points and to print it somewhere later.
Currently what I got is:
{% set points = 0 -%}
{% for single_item in items -%}
{% set points = points + single_item["points"] -%}
{{points}}
{% endfor %}
{{ points }}
Result is: 5 12 14 25 0
Is there any way that I can get that points outside of loop has value 25 (last value from the loop)?
回答1:
Jinja2 includes a sum filter which will do this for you:
{{ items | sum(attribute='points') }}
See documentation here: http://jinja.pocoo.org/docs/dev/templates/#sum
回答2:
I've managed to make it work, although solution is not elegant, but it is working:
{% set points = [0] -%}
{% for single_item in items -%}
{% if points.append(points.pop()+ single_item["points"]) -%}{% endif %}
{% endfor %}
{{ points }}
points will be array with just one element that has sum.
It can be also done with included do extension, and that would replace {% if %} line.
回答3:
That sort of logic should usually go in the controller, not the template (separating logic from presentation). Preprocess your data accordingly, and pass items as well as total to the template:
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 }}
For details on the expression sum([i['points'] for i in items])
see list comprehensions.
来源:https://stackoverflow.com/questions/25525101/sum-elements-of-the-list-in-jinja-2