Comment trier une liste dans Jinja2?

88

J'essaye de faire ceci:

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

Mais ce n'est pas vrai ... la documentation est vague ... comment faites-vous cela dans Jinja2?

Nick Perkins
la source

Réponses:

170

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

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

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

Steve S
la source
Merci, c'est exactement ce que je voulais. Au fait, 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)
Nick Perkins
@Nick: J'ai fait un test rapide, et il semblait fonctionner à la fois avec des objets et des dictionnaires.
Steve S
2
Bien, cela fonctionne également pour un index tuple:list_of_tuples|sort(attribute='0')
Navin
Il peut être pratique d'afficher les valeurs en ordre inverse (cela peut être intéressant pour les notations par exemple), dans ce cas il suffit d'utiliser l'option reverse=True.
Romain
25

Si vous souhaitez trier par 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) %}
SumanKalyan
la source
14

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

Cependant, vous pouvez toujours essayer {% for movie in movie_list|sort %}. Voilà la syntaxe. Vous ne pouvez fournir aucune information clé pour le tri.

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

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

S'il movie_lists'agit d'une liste de tuples ou de listes, la note doit être la première. Ou vous devrez faire le tri en dehors de Jinja2.

Si movie_listest 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.

S.Lott
la source
OK merci. J'ai fini par trier en Python avant d'envoyer au modèle: <code> movie_list = sorted (movie_list, key = lambda movie: movie.rating, reverse = True) </code> Dommage, cela pourrait être bien de laisser le modèle décider sur l'ordre de tri! (D'autres moteurs de modèles pourraient-ils faire cela?)
Nick Perkins
2
Les versions récentes de Jinja2 permettent désormais de spécifier un attribut à trier.
Steve S
1
@Steve S: Intéressant. Pourriez-vous publier une réponse avec vos nouvelles informations? Veuillez inclure le numéro de version.
S.Lott
1
Petite correction: après avoir vérifié la source j'ai découvert qu'il est possible de spécifier un index au cas où votre liste serait faite de tuples (par exemple en retour par dict.items()):sort(attribut='1')
Lucas Cimon
@SLott - le cas d'utilisation du tri dans le modèle est: Il s'agit de la couche d'affichage - capable de rendre plusieurs vues des mêmes données - celles-ci pourraient être deux équipes distinctes. Pourquoi ne pas recommencer dans la couche d'affichage? semble être un bon endroit pour rompre le couplage des préoccupations.
Shane C. Mason