2009-12-24 7 views

Répondre

105

de la version 2.6, le filtre de tri intégré de Jinja2 vous permet de spécifier un attribut à trier par:

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

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

+0

Merci, c'est exactement ce que je voulais. En passant, cela fonctionne-t-il avec les deux types d'attributs ... vous connaissez __getattr__ et __getitem__? (parce que je ne me souviens pas si les "films" étaient des objets ou des dictionnaires) –

+0

@Nick: J'ai fait un test rapide, et il a semblé fonctionner avec les objets et les dicts. –

11

Habituellement, nous trions la liste avant de la donner à Jinja2. Il n'y a aucun moyen de spécifier une clé dans le filtre sort de Jinja.

Toutefois, vous pouvez toujours essayer {% for movie in movie_list|sort %}. C'est la syntaxe. Vous ne fournissez aucune information clé pour le tri.

Vous pouvez également essayer d'écrire un filtre personnalisé pour cela. Cela semble stupide quand vous pouvez trier avant de donner les données à Jinja2.

Si movie_list est une liste d'objets, vous pouvez définir les différentes méthodes de comparaison (__lt__, __gt__, etc.) pour la classe de ces objets.

Si movie_list est une liste de tuples ou de listes, le classement doit être en premier. Ou vous devrez faire le tri en dehors de Jinja2. Si movie_list est une liste de dictionnaires, vous pouvez utiliser dictsort, qui accepte une spécification de clé pour le tri. Lisez ceci: http://jinja.pocoo.org/2/documentation/templates#dictsort pour un exemple.

+0

Ok, merci. J'ai fini par trier en Python avant de l'envoyer au template: movie_list = sorted(movie_list, key = lambda movie:movie.rating, reverse = True) Dommage, ce serait bien de laisser le template décider de l'ordre de tri! (d'autres moteurs de gabarits peuvent-ils le faire?) –

+1

Les versions récentes de Jinja2 permettent maintenant de spécifier un attribut à trier. –

+1

@Steve S: Intéressant. Pourriez-vous réellement poster une ** réponse ** avec vos nouvelles informations? Inclure le numéro de version, s'il vous plaît. –

7

Si vous voulez trier dans l'ordre croissant

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

Si vous souhaitez trier par ordre décroissant

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