Jak sortujesz listę w Jinja2?

88

Próbuję to zrobić:

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

Ale to nie w porządku ... dokumentacja jest niejasna ... jak to zrobić w Jinja2?

Nick Perkins
źródło

Odpowiedzi:

170

Od wersji 2.6 wbudowany filtr sortowania Jinja2 pozwala określić atrybut do sortowania według:

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

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

Steve S.
źródło
Dzięki, właśnie tego chciałem. Nawiasem mówiąc, czy to działa z obydwoma typami atrybutów ... znasz getattr i getitem ? (bo nie mogę sobie przypomnieć, czy „filmy” były przedmioty lub słowniki)
Nick Perkins
@Nick: Zrobiłem szybki test i wydawało się, że działa zarówno z obiektami, jak i dyktami.
Steve S
2
Świetnie, działa to również dla indeksu krotek:list_of_tuples|sort(attribute='0')
Navin,
Przydatne może być wyświetlanie wartości w odwrotnej kolejności (może to być interesujące na przykład w przypadku ocen), w tym przypadku wystarczy skorzystać z opcji reverse=True.
Romain
25

Jeśli chcesz posortować w kolejności rosnącej

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

Jeśli chcesz posortować w porządku malejącym

{% for movie in movie_list|sort(attribute='rating', reverse = True) %}
SumanKalyan
źródło
14

Zwykle sortujemy listę przed przekazaniem jej Jinja2. Nie ma sposobu, aby określić klucz w sortfiltrze Jinja .

Jednak zawsze możesz spróbować {% for movie in movie_list|sort %}. Taka jest składnia. Nie możesz podać żadnych kluczowych informacji do sortowania.

Możesz także spróbować napisać niestandardowy filtr. Wydaje się głupie, kiedy można posortować dane przed przekazaniem danych Jinja2.

Jeśli movie_listjest to lista obiektów, można określić różne metody porównania ( __lt__, __gt__etc.) dla klasy tych obiektów.

Jeśli movie_listjest to lista krotek lub list, ocena musi być pierwsza. Albo będziesz musiał zrobić sortowanie poza Jinja2.

Jeśli movie_listjest to lista słowników, możesz użyć dictsort, która akceptuje specyfikację klucza do sortowania. Przeczytaj to: http://jinja.pocoo.org/2/documentation/templates#dictsort jako przykład.

S.Lott
źródło
Ok dzięki. Skończyło się na sortowaniu w Pythonie przed wysłaniem do szablonu: <code> movie_list = sort (movie_list, key = lambda movie: movie.rating, reverse = True) </code> Szkoda, fajnie byłoby pozwolić szablonowi zdecydować w kolejności sortowania! (czy inne silniki szablonów mogłyby to zrobić?)
Nick Perkins,
2
Najnowsze wersje Jinja2 umożliwiają teraz określenie atrybutu do sortowania.
Steve S
1
@Steve S: Ciekawe. Czy mógłbyś zamieścić odpowiedź z nowymi informacjami? Proszę podać numer wersji.
S.Lott
1
Mała korekta: po sprawdzeniu źródła dowiedziałem się, że jest możliwe, aby określić wskaźnik w przypadku, gdy lista jest wykonana z krotek (np zamian za dict.items()):sort(attribut='1')
Lucas Cimon
@SLott - przypadek użycia sortowania w szablonie jest następujący: To jest warstwa wyświetlania - zdolna do renderowania wielu widoków tych samych danych - mogą to być dwa oddzielne zespoły. Dlaczego nie zadziała to ponownie w warstwie wyświetlania? wydaje się dobrym miejscem na przerwanie łączenia obaw.
Shane C. Mason