2014-08-27 107 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