【问题标题】:Sum elements of the list in Jinja 2Jinja 2中列表的总和
【发布时间】:2014-08-27 10:44:23
【问题描述】:

我在 Jinja2 中有一个列表,其中包含本身的 dicts。类似的东西

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

我需要的是得到所有 points 的总和,然后在某个地方打印出来。

目前我得到的是:

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

结果是:5 12 14 25 0

有什么方法可以让我在循环之外获得 points 的值 25(循环中的最后一个值)?

【问题讨论】:

  • 这种逻辑属于控制器,而不是模板。相应地预处理您的数据,并将items 作为total 传递给模板。
  • @LukasGraf 也许您应该将其发布为答案?
  • @LukasGraf 我完全同意你的看法,但在我的情况下,这会造成很大的混乱。

标签: python jinja2


【解决方案1】:

Jinja2 包含一个 sum 过滤器,它将为您执行此操作:

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

在此处查看文档:https://jinja.palletsprojects.com/templates/#jinja-filters.sum

【讨论】:

  • 这应该是公认的答案。比接受的答案更干净,但仍然可以正常工作
【解决方案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

【讨论】:

  • 虽然这是一个很好的答案,而且我知道可以这样做,但就我而言,它不会很好地工作。将有几个具有支持值的字典,并且代码一团糟。我想我已经找到了一种方法来做到这一点,需要更多地测试它,如果它有效,将发布答案。
  • 那么你可能需要重构你的代码。您可以编辑您的问题以包含您的代码示例和几个字典吗?
【解决方案3】:

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

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

points 将是只有一个元素具有 sum 的数组。

也可以通过包含的 do 扩展来完成,这将替换 {% if %} 行。

【讨论】:

  • ? 这不是最好的答案
猜你喜欢
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 2022-01-10
  • 1970-01-01
  • 2022-01-17
  • 2015-07-15
相关资源
最近更新 更多