¿Cómo se ordena una lista en Jinja2?

88

Estoy tratando de hacer esto:

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

Pero eso no es correcto ... la documentación es vaga ... ¿cómo se hace esto en Jinja2?

Nick Perkins
fuente

Respuestas:

170

A partir de la versión 2.6, el filtro de clasificación integrado de Jinja2 le permite especificar un atributo para ordenar:

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

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

Steve S
fuente
Gracias, eso es exactamente lo que quería. Por cierto, ¿funciona con ambos tipos de atributos ... conoces getattr y getitem ? (porque no recuerdo si las "películas" eran objetos o diccionarios)
Nick Perkins
@Nick: Hice una prueba rápida y pareció funcionar tanto con objetos como con dictados.
Steve S
2
Bien, esto también funciona para un índice de tuplas:list_of_tuples|sort(attribute='0')
Navin
Podría ser útil mostrar los valores en orden inverso (podría ser interesante para las calificaciones, por ejemplo), en este caso solo use la opción reverse=True.
Romain
25

Si desea ordenar en orden ascendente

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

Si desea ordenar en orden descendente

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

Normalmente ordenamos la lista antes de dársela a Jinja2. No hay forma de especificar una clave en el sortfiltro de Jinja .

Sin embargo, siempre puedes intentarlo {% for movie in movie_list|sort %}. Esa es la sintaxis. No puede proporcionar ningún tipo de información clave para la clasificación.

También puede intentar escribir un filtro personalizado para esto. Parece una tontería cuando puedes ordenar antes de darle los datos a Jinja2.

Si movie_listes una lista de objetos, a continuación, se pueden definir los diferentes métodos de comparación ( __lt__, __gt__, etc.) para la clase de esos objetos.

Si movie_listes una lista de tuplas o listas, la clasificación debe ser la primera. O tendrás que hacer la clasificación fuera de Jinja2.

Si movie_listes una lista de diccionarios, entonces puede usar dictsort, que acepta una especificación clave para la clasificación. Lea esto: http://jinja.pocoo.org/2/documentation/templates#dictsort para ver un ejemplo.

S. Lot
fuente
OK gracias. Terminé ordenando en Python antes de enviar a la plantilla: <code> movie_list = sorted (movie_list, key = lambda movie: movie.rating, reverse = True) </code> Lástima, podría ser bueno dejar que la plantilla decida en el orden de clasificación! (¿Podrían otros motores de plantilla hacer esto?)
Nick Perkins
2
Las versiones recientes de Jinja2 ahora permiten especificar un atributo para ordenar.
Steve S
1
@Steve S: Interesante. ¿Podrías publicar una respuesta con tu nueva información? Incluya el número de versión, por favor.
S.Lott
1
Pequeña corrección: después de comprobar la fuente descubrí que es posible especificar un índice en caso de que se haga su lista de tuplas (por ejemplo, como retorno por dict.items()):sort(attribut='1')
Lucas Cimón
@SLott: el caso de uso para ordenar en la plantilla es: Esta es la capa de visualización, capaz de representar múltiples vistas de los mismos datos, estos podrían ser dos equipos separados. ¿Por qué no volver a hacer esto en la capa de visualización? parece un buen lugar para romper el acoplamiento de preocupaciones.
Shane C. Mason