Bagaimana Anda mengurutkan daftar di Jinja2?

90

Saya mencoba melakukan ini:

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

Tapi itu tidak benar ... dokumentasinya tidak jelas ... bagaimana Anda melakukan ini di Jinja2?

Nick Perkins
sumber

Jawaban:

172

Mulai versi 2.6, filter sortir bawaan Jinja2 memungkinkan Anda menentukan atribut yang akan diurutkan berdasarkan:

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

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

Steve S
sumber
Terima kasih, itulah yang saya inginkan. Ngomong-ngomong, apakah ini berfungsi dengan kedua jenis atribut ... Anda tahu getattr dan getitem ? (karena saya tidak dapat mengingat apakah "film" adalah objek atau kamus)
Nick Perkins
@ Nick: Saya melakukan tes cepat, dan tampaknya bekerja dengan objek dan penis.
Steve S
2
Bagus, ini juga berfungsi untuk indeks tupel:list_of_tuples|sort(attribute='0')
Navin
Mungkin berguna untuk menampilkan nilai dalam urutan terbalik (bisa menarik untuk peringkat misalnya), dalam hal ini gunakan saja opsi reverse=True.
Romain
26

Jika Anda ingin mengurutkan dalam urutan menaik

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

Jika Anda ingin mengurutkan dalam urutan menurun

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

Biasanya kami mengurutkan daftar sebelum memberikannya ke Jinja2. Tidak ada cara untuk menentukan kunci dalam sortfilter Jinja .

Namun, Anda selalu bisa mencobanya {% for movie in movie_list|sort %}. Itu sintaksnya. Anda tidak boleh memberikan informasi kunci apa pun untuk penyortiran.

Anda juga dapat mencoba dan menulis filter khusus untuk ini. Tampak konyol jika Anda bisa mengurutkan sebelum memberikan data ke Jinja2.

Jika movie_listadalah daftar objek, maka Anda dapat menentukan berbagai metode perbandingan ( __lt__, __gt__, dll) untuk kelas objek tersebut.

Jika movie_listmerupakan daftar tupel atau daftar, peringkatnya harus pertama. Atau Anda harus melakukan penyortiran di luar Jinja2.

Jika movie_listdaftar kamus, maka Anda dapat menggunakan dictsort, yang menerima spesifikasi kunci untuk penyortiran. Baca ini: http://jinja.pocoo.org/2/documentation/templates#dictsort sebagai contoh.

S. Lott
sumber
Ok terima kasih. Saya akhirnya menyortir dengan Python sebelum mengirim ke template: <code> movie_list = sort (movie_list, key = lambda movie: movie.rating, reverse = True) </code> Sayang sekali, mungkin lebih baik membiarkan template memutuskan dalam urutan sortir! (bisakah mesin templat lain melakukan ini?)
Nick Perkins
2
Versi terbaru Jinja2 sekarang memungkinkan penentuan atribut yang akan disortir.
Steve S
1
@ Steve S: Menarik. Bisakah Anda benar-benar memposting jawaban dengan informasi baru Anda? Harap sertakan nomor versi.
S. Lotot
1
Koreksi kecil: setelah memeriksa sumbernya, saya menemukan bahwa dimungkinkan untuk menentukan indeks jika daftar Anda terbuat dari tupel (misalnya, dikembalikan oleh dict.items()):sort(attribut='1')
Lucas Cimon
@SLott - kasus penggunaan untuk mengurutkan dalam template adalah: Ini adalah lapisan tampilan - mampu menampilkan beberapa tampilan dari data yang sama - ini bisa menjadi dua tim yang terpisah. Mengapa ini tidak berfungsi di lapisan tampilan lagi? sepertinya tempat yang bagus untuk memecahkan masalah.
Shane C. Mason