Come si ordina un elenco in Jinja2?


90

Sto provando a fare questo:

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

Ma non è giusto ... la documentazione è vaga ... come si fa in Jinja2?

Risposte:


172

A partire dalla versione 2.6, il filtro di ordinamento integrato di Jinja2 consente di specificare un attributo in base a cui ordinare:

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

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


Grazie, è esattamente quello che volevo. A proposito, funziona con entrambi i tipi di attributi ... conosci getattr e getitem ? (perché non ricordo se i "film" fossero oggetti o dizionari)
Nick Perkins

@ Nick: ho fatto un rapido test e sembrava funzionare sia con oggetti che con dict.
Steve S

2
Bene, questo funziona anche per un indice di tupla:list_of_tuples|sort(attribute='0')
Navin

Potrebbe essere utile visualizzare i valori in ordine inverso (potrebbe essere interessante ad esempio per le valutazioni), in questo caso basta utilizzare l'opzione reverse=True.
Romain

26

Se vuoi ordinare in ordine crescente

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

Se vuoi ordinare in ordine decrescente

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

14

Di solito ordiniamo l'elenco prima di darlo a Jinja2. Non c'è modo di specificare una chiave nel sortfiltro di Jinja .

Tuttavia, puoi sempre provare {% for movie in movie_list|sort %}. Questa è la sintassi. Non puoi fornire alcun tipo di informazione chiave per l'ordinamento.

Puoi anche provare a scrivere un filtro personalizzato per questo. Sembra sciocco quando puoi ordinare prima di dare i dati a Jinja2.

Se movie_listè un elenco di oggetti, quindi è possibile definire i vari metodi di confronto ( __lt__, __gt__, ecc) per la classe di quegli oggetti.

Se movie_listè un elenco di tuple o elenchi, il punteggio deve essere il primo. Oppure dovrai fare lo smistamento fuori Jinja2.

Se movie_listè un elenco di dizionari, è possibile utilizzare dictsort, che accetta una specifica chiave per l'ordinamento. Leggi questo: http://jinja.pocoo.org/2/documentation/templates#dictsort per un esempio.


Ok grazie. Ho finito per ordinare in Python prima di inviarlo al modello: <code> movie_list = ordinato (movie_list, key = lambda movie: movie.rating, reverse = True) </code> Peccato, potrebbe essere carino lasciare che il modello decida nell'ordinamento! (potrebbero farlo altri motori di modelli?)
Nick Perkins,

2
Le versioni recenti di Jinja2 ora consentono di specificare un attributo in base al quale ordinare.
Steve S

1
@ Steve S: interessante. Potresti effettivamente pubblicare una risposta con le tue nuove informazioni? Includere il numero di versione, per favore.
S.Lott

1
Piccola correzione: dopo aver controllato la fonte ho scoperto che è possibile specificare un indice nel caso in cui la tua lista sia composta da tuple (es. Come return by dict.items()):sort(attribut='1')
Lucas Cimon

@SLott - Il caso d'uso per l'ordinamento nel modello è: Questo è il livello di visualizzazione - in grado di visualizzare più visualizzazioni degli stessi dati - questi potrebbero essere due team separati. Perché non eseguire di nuovo questo lavoro nel livello di visualizzazione? sembra un buon posto per rompere l'accoppiamento di preoccupazioni.
Shane C. Mason
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.