2009-12-24 22 views

Odpowiedz

105

Począwszy od wersji 2.6, wbudowany filtr sortowania Jinja2 pozwala określić atrybut, aby posortować według:

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

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

+0

Dzięki, dokładnie tego chciałem. A propos, czy działa z obydwoma typami atrybutów ... wiesz, __getattr__ i __getitem__? (ponieważ nie pamiętam, czy "filmy" były obiektami lub słownikami) –

+0

@Nick: Zrobiłem szybki test i wydawało mi się, że działa zarówno z obiektami, jak i dyktami. –

11

Zazwyczaj sortujemy listę przed przekazaniem jej Jinja2. Nie ma możliwości określenia klucza w filtrze Jinja o numerze sort.

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

Można również spróbować zapisać niestandardowy filtr dla tego. Wydaje się głupie, kiedy można sortować przed przekazaniem danych do Jinja2.

Jeśli Jeśli lista obiektów to movie_list, można zdefiniować różne metody porównywania (__lt__, __gt__ itd.) Dla klasy tych obiektów.

Jeśli movie_list jest listą krotek lub list, ocena musi być pierwsza. Albo będziesz musiał dokonać sortowania poza Jinja2.

Jeśli movie_list jest listą słowników, można użyć dictsort, która akceptuje kluczową specyfikację sortowania. Przeczytaj to: http://jinja.pocoo.org/2/documentation/templates#dictsort na przykład.

+0

OK, dziękuję. Kończenie sortowania w Pythonie przed wysłaniem do szablonu: movie_list = sorted(movie_list, key = lambda movie:movie.rating, reverse = True) To może być miłe, niech szablon decyduje o kolejności sortowania! (czy mogą to zrobić inne silniki szablonów?) –

+1

Ostatnie wersje aplikacji Jinja2 umożliwiają teraz określenie atrybutu sortowania według. –

+1

@Steve S: Interesujące. Czy mógłbyś opublikować ** odpowiedź ** z nowymi informacjami? Proszę podać numer wersji. –

7

Jeśli chcesz, aby 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) %}