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.