您如何在Jinja2中对列表进行排序?


88

我正在尝试这样做:

 {% for movie in movie_list | sort(movie.rating) %}

但这不对...文档模糊不清...您如何在Jinja2中做到这一点?

Answers:


170

从2.6版开始,Jinja2的内置排序过滤器允许您指定属性以进行排序:

{% for movie in movie_list|sort(attribute='rating') %}

参见http://jinja.pocoo.org/docs/templates/#sort


谢谢,这正是我想要的。顺便说一句,它同时适用于两种类型的属性...您知道getattrgetitem吗?(因为我不记得“电影”是物体还是字典)
Nick Perkins

@Nick:我做了一个快速测试,它似乎可以同时处理对象和字典。
史蒂夫·S

2
不错,这也适用于元组索引:list_of_tuples|sort(attribute='0')
Navin

以相反的顺序显示值可能很方便(例如,对于等级可能很有趣),在这种情况下,只需使用option即可reverse=True
罗曼(Romain)

25

如果要按升序排序

{% for movie in movie_list|sort(attribute='rating') %}

如果要按降序排序

{% for movie in movie_list|sort(attribute='rating', reverse = True) %}

13

通常,我们在将列表提供给Jinja2之前对其进行排序。无法在Jinja的sort过滤器中指定键。

但是,您可以随时尝试{% for movie in movie_list|sort %}。这就是语法。您不会为排序提供任何关键信息。

您也可以尝试为此编写一个自定义过滤器。在将数据提供给Jinja2之前可以进行排序时似乎很傻。

如果movie_list是对象的列表,那么你可以定义各种比较方法(__lt____gt__对这些对象的类,等等)。

如果movie_list是元组或列表列表,则等级必须为第一。否则,您将不得不在Jinja2之外进行排序。

如果movie_list是词典列表,则可以使用dictsort,它接受用于排序的键规范。阅读此示例:http : //jinja.pocoo.org/2/documentation/templates#dictsort


好,谢谢。在发送到模板之前,我确实使用Python进行了排序:<code> movie_list = sorted(movie_list,key = lambda movie:movie.rating,reverse = True)</ code>太糟糕了,让模板决定可能会很好在排序顺序上!(其他模板引擎可以做到这一点吗?)
Nick Perkins

2
现在,Jinja2的最新版本允许指定要排序的属性。
史蒂夫·S

1
@Steve S:有趣。您可以实际发布带有新信息的答案吗?请附上版本号。
S.Lott

1
较小的更正:在检查了之后,我发现可以指定索引,以防您的列表由元组组成(例如由return返回dict.items()):sort(attribut='1')
Lucas Cimon

@SLott-在模板中排序的用例是:这是显示层-能够呈现相同数据的多个视图-这可以是两个独立的团队。为什么不再次在显示层中执行此操作?似乎是打破关注耦合的好地方。
Shane C. Mason,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.