Jinja2でリストをどのようにソートしますか?


88

私はこれをやろうとしています:

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

しかし、それは正しくありません...ドキュメントはあいまいです... Jinja2でこれをどのように行いますか?

回答:


170

バージョン2.6以降、Jinja2の組み込みの並べ替えフィルターを使用すると、並べ替える属性を指定できます。

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

http://jinja.pocoo.org/docs/templates/#sortを参照してください


おかげで、それはまさに私が欲しかったものです。ちなみに、それは両方のタイプの属性で機能しますか... getattrgetitemを知っていますか?(「映画」がオブジェクトなのか辞書なのか思い出せないため)
Nick Perkins

@Nick:簡単なテストを行いましたが、オブジェクトとdictの両方で機能するようでした。
スティーブS

2
ニース、これはタプルインデックスでも機能します:list_of_tuples|sort(attribute='0')
Navin 2018

値を逆の順序で表示すると便利な場合があります(たとえば、評価に役立つ場合があります)reverse=True。この場合は、オプションを使用するだけです。
ロマン・

25

昇順で並べ替える場合

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

降順で並べ替える場合

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

14

通常、リストを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 = sort(movie_list、key = lambda movie:movie.rating、reverse = True)</ code>残念ながら、テンプレートに決定させるのは良いことかもしれませんソート順で!(他のテンプレートエンジンでこれを行うことができますか?)
Nick Perkins

2
Jinja2の最近のバージョンでは、並べ替える属性を指定できるようになりました。
Steve S

1
@スティーブS:興味深い。あなたは実際にあなたの新しい情報で答えを投稿できますか?バージョン番号を含めてください。
S.Lott 2011年

1
小さな修正:ソースを確認した後、リストがタプルで構成されている場合にインデックスを指定できることがわかりました(たとえば、return byとしてdict.items()):sort(attribut='1')
Lucas Cimon

@ SLott-テンプレートでの並べ替えのユースケースは次のとおりです。これは表示レイヤーです-同じデータの複数のビューをレンダリングできます-これらは2つの別々のチームである可能性があります。これをディスプレイレイヤーでもう一度機能させてみませんか?懸念の結合を断ち切るのに良い場所のようです。
シェーンC.メイソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.