使用Jinja2计算具有特定值的列表中的元素

时间:2013-03-14 10:37:44

标签: jinja2

假设我有一个对象或dicts数组,我想用一个具有特定值的属性来计算数组中的对象数。

Jinja已经提供了一种迭代具有特定值的元素的机制:

{% set list = [dict(a=1),dict(a=2),dict(a=1)] %}
{{ list }}<br/>
{% for e in list if e.a == 1 %}
   ...
{% endfor %}

我只想知道for循环的评估次数。

我能够提出的最好的方法是使用loop.last变量来评估上述循环的最后一次迭代中的表达式

{% set list = [dict(a=1),dict(a=2),dict(a=1)] %}
{{ list }}<br/>
{% for e in list if e.a == 1 %}
  {% if loop.last %}
    list contains {{ loop.index }} elements with a=1
  {% endif %}
{% endfor %}
但是,如果匹配项的数量为零,则这将不起作用。我显然可以把条件放在循环中来解决这个问题

{% set list = [dict(a=1),dict(a=2),dict(a=1)] %}
{{ list }}<br/>
{% for e in list %}
  {% if e.a == 1 %}
    {% set count = count|d(0) + 1 %}
  {% endif %}
  {% if loop.last %}
    list contains {{ count }} elements with a=1
  {% endif %}
{% endfor %}

只要列表不为空,现在就可以了(在我的情况下,列表永远不会为空)。

另一个明显的答案是向可用于执行此计算的全局上下文添加一个函数,但我很惊讶这些功能尚不存在。

我的目标是在表格中存在特定值时更改某些表格标题的样式。

2 个答案:

答案 0 :(得分:0)

还有loop.length,您是否看过使用它?

答案 1 :(得分:0)

您可以使用jinja的功能以简洁的方式实现目标,而无需使用循环:

{{ yourlist | selectattr("a", "equalto", 1) | list | count }}

请注意,您必须使用 list 过滤器才能进行计数。