2009-12-24 10 views

risposta

105

A partire dalla versione 2.6, filtro tipo built-in di Jinja2 consente di specificare un attributo per l'ordinamento:

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

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

+0

Grazie, è esattamente quello che volevo. A proposito, funziona con entrambi i tipi di attributi ... sai __getattr__ e __getitem__? (perché non riesco a ricordare se i "film" fossero oggetti o dizionari) –

+0

@Nick: ho fatto un test rapido, e sembrava funzionare sia con gli oggetti che con i dicts. –

11

Di solito ordiniamo la lista prima di darla a Jinja2. Non c'è modo di specificare una chiave nel filtro sort di Jinja.

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

Si può anche provare e 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, è possibile definire i vari metodi di confronto (__lt__, __gt__, ecc.) Per la classe di tali oggetti.

Se movie_list è un elenco di tuple o elenchi, la valutazione deve essere la prima. O dovrai fare lo smistamento fuori da 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.

+0

Ok, grazie. Ho terminato l'ordinamento in Python prima di inviarlo al modello: movie_list = sorted(movie_list, key = lambda movie:movie.rating, reverse = True) Peccato, potrebbe essere bello lasciare che il modello decida sull'ordinamento! (altri motori di template potrebbero farlo?) –

+1

Le versioni recenti di Jinja2 ora consentono di specificare un attributo da ordinare per. –

+1

@Steve S: interessante. Potresti pubblicare una ** risposta ** con le tue nuove informazioni? Includi il numero di versione, per favore. –

7

Se si desidera ordinare in ordine crescente

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

Se si desidera ordinare in ordine discendente

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