Wie sortiert man eine Liste in Jinja2?

88

Ich versuche das zu tun:

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

Aber das ist nicht richtig ... die Dokumentation ist vage ... wie macht man das in Jinja2?

Nick Perkins
quelle

Antworten:

167

Ab Version 2.6 können Sie mit dem integrierten Sortierfilter von Jinja2 ein Attribut angeben, nach dem sortiert werden soll:

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

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

Steve S.
quelle
Danke, genau das wollte ich. Funktioniert es übrigens mit beiden Arten von Attributen ... Sie kennen getattr und getitem ? (weil ich mich nicht erinnern kann, ob "Filme" Objekte oder Wörterbücher waren)
Nick Perkins
@ Nick: Ich habe einen kurzen Test gemacht und es schien sowohl mit Objekten als auch mit Diktaten zu funktionieren.
Steve S
2
Schön, das funktioniert auch für einen Tupelindex:list_of_tuples|sort(attribute='0')
Navin
Es kann nützlich sein, Werte in umgekehrter Reihenfolge anzuzeigen (dies kann beispielsweise für Bewertungen interessant sein). In diesem Fall verwenden Sie einfach die Option reverse=True.
Romain
24

Wenn Sie in aufsteigender Reihenfolge sortieren möchten

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

Wenn Sie in absteigender Reihenfolge sortieren möchten

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

Normalerweise sortieren wir die Liste, bevor wir sie Jinja2 geben. Es gibt keine Möglichkeit, einen Schlüssel in Jinjas sortFilter anzugeben .

Sie können es jedoch jederzeit versuchen {% for movie in movie_list|sort %}. Das ist die Syntax. Sie können keine Schlüsselinformationen für die Sortierung angeben.

Sie können auch versuchen, einen benutzerdefinierten Filter dafür zu schreiben. Scheint albern, wenn Sie sortieren können, bevor Sie die Daten an Jinja2 weitergeben.

Wenn movie_listeine Liste von Objekten ist, dann können Sie die verschiedenen Vergleichsmethoden (definieren __lt__, __gt__usw.) für die Klasse dieser Objekte.

Wenn movie_listes sich um eine Liste von Tupeln oder Listen handelt, muss die Bewertung an erster Stelle stehen. Oder Sie müssen die Sortierung außerhalb von Jinja2 durchführen.

Wenn movie_listes sich um eine Liste von Wörterbüchern handelt, können Sie diese verwenden dictsort, die eine Schlüsselspezifikation für die Sortierung akzeptiert. Lesen Sie dies als Beispiel : http://jinja.pocoo.org/2/documentation/templates#dictsort .

S.Lott
quelle
OK danke. Am Ende habe ich in Python sortiert, bevor ich an die Vorlage gesendet habe: <code> movie_list = sortiert (movie_list, key = lambda movie: movie.rating, reverse = True) </ code> Schade, es könnte schön sein, die Vorlage entscheiden zu lassen auf die Sortierreihenfolge! (
Nick Perkins
2
In neueren Versionen von Jinja2 können Sie jetzt ein Attribut angeben, nach dem sortiert werden soll.
Steve S
1
@Steve S: Interessant. Könnten Sie tatsächlich eine Antwort mit Ihren neuen Informationen posten ? Bitte geben Sie die Versionsnummer an.
S.Lott
1
Kleine Korrektur: Nachdem ich die Quelle überprüft hatte, stellte ich fest, dass es möglich ist, einen Index anzugeben, falls Ihre Liste aus Tupeln besteht (z. B. als Rückgabe von dict.items()):sort(attribut='1')
Lucas Cimon
@SLott - Anwendungsfall für das Sortieren in der Vorlage ist: Dies ist die Anzeigeebene, die mehrere Ansichten derselben Daten rendern kann. Dies können zwei separate Teams sein. Warum funktioniert das nicht wieder in der Anzeigeebene? scheint ein guter Ort zu sein, um die Kopplung von Bedenken zu brechen.
Shane C. Mason