5

可以在 Jinja2 中连续应用排序过滤器,先按一个属性对列表进行排序,然后再按另一个属性排序?这似乎是一件很自然的事情,但在我的测试中,前面的排序完全不稳定,所有排序都丢失了。

在将列表传递给模板之前,我已经通过首先在 python 中排序来解决它,但我想知道是否可以在 Jinja2 中对“稳定”进行排序。

我应用过滤器的方式是这样的:

{{ item_list|sort(attribute='value')|sort(attribute='color') }}

我希望看到的是按 排序的列表color,其中的元素共享按 排序的颜色value。相反,它看起来就像value这种事情从未发生过一样。

例如,从此列表中:

2 red
3 blue
3 red
2 blue
1 blue
4 red

我想要这样的东西:

1 blue
2 blue
3 blue
2 red
3 red
4 red

我查看了groupby过滤器,但该实现似乎太复杂了(需要嵌套的 for 循环)。

4

1 回答 1

9

我不知道可以做到这一点的本机 jinja2 过滤器。要基于多个属性对列表进行排序,您可以在 jinja2中定义自定义过滤器。

这个问题的接受答案中,您可以编写自己的过滤器

import operator

def sort_multi(L,*operators): 
    L.sort(key=operator.itemgetter(*operators))
    return L

在您的应用程序环境中注册它。所以pyramid,你会做类似的事情

env = config.get_jinja2_environment()
env.filters['sort_multi'] = sort_multi

最后在您的模板中

{{item_list|sort_multi('value','color')}}
于 2013-04-22T11:24:03.597 回答