2009-12-24 19 views

Respuesta

105

partir de la versión 2.6, filtro de tipo incorporado en Jinja2 le permite especificar un atributo para ordenar por:

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

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

+0

Gracias, eso es exactamente lo que quería. Por cierto, ¿funciona con ambos tipos de atributos ... sabes __getattr__ y __getitem__? (porque no recuerdo si las "películas" eran objetos o diccionarios) –

+0

@Nick: Hice una prueba rápida, y pareció funcionar tanto con objetos como con dictados. –

11

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

Sin embargo, siempre puedes probar {% 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 y escribir un filtro personalizado para esto. Parece tonto cuando puedes ordenar antes de dar los datos a Jinja2.

Si movie_list es una lista de los 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_list es una lista de tuplas o listas, la evaluación debe ser primero. O tendrás que hacer la clasificación fuera de Jinja2.

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

+0

Ok, gracias. terminé ordenando en Python antes de enviar a la plantilla: movie_list = sorted(movie_list, key = lambda movie:movie.rating, reverse = True) Lástima, sería bueno dejar que la plantilla decida el orden de clasificación. (podrían otros motores de plantillas hacer esto?) –

+1

Las versiones recientes de Jinja2 ahora permiten especificar un atributo por el que ordenar. –

+1

@Steve S: Interesante. ¿Podría publicar una ** respuesta ** con su nueva información? Incluya el número de versión, por favor. –

7

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) %} 
Cuestiones relacionadas