【问题标题】:How do you sort a list in Jinja2?你如何在 Jinja2 中对列表进行排序?
【发布时间】:2010-12-29 21:14:36
【问题描述】:

我正在尝试这样做:

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

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

【问题讨论】:

    标签: python sorting jinja2


    【解决方案1】:

    通常我们在将列表提供给 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 中进行了排序: movie_list = sorted(movie_list, key = lambda movie:movie.rating, reverse = True ) 太糟糕了,让模板决定可能会很好按排序顺序! (其他模板引擎可以这样做吗?)
    • Jinja2 的最新版本现在允许指定要排序的属性。
    • @Steve S:很有趣。你真的可以用你的新信息发布一个答案吗?请附上版本号。
    • 小更正:检查source后,我发现可以指定索引以防您的列表由元组组成(例如dict.items()返回):sort(attribut='1')
    • @SLott - 在模板中排序的用例是:这是显示层 - 能够呈现相同数据的多个视图 - 这可能是两个独立的团队。为什么不在显示层再做一次呢?似乎是打破关注点耦合的好地方。
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢,这正是我想要的。顺便说一句,它是否适用于两种类型的属性...你知道 getattrgetitem 吗? (因为我不记得“电影”是对象还是字典)
    • @Nick:我做了一个快速测试,它似乎适用于对象和字典。
    • 很好,这也适用于元组索引:list_of_tuples|sort(attribute='0')
    • 以相反的顺序显示值可能很方便(例如,评级可能很有趣),在这种情况下,只需使用选项reverse=True
    【解决方案3】:

    如果要按升序排序

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

    如果要降序排序

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-23
      • 1970-01-01
      • 2022-01-05
      • 2012-12-16
      • 2019-11-29
      相关资源
      最近更新 更多