Как сортировать список в Jinja2?

88

Я пытаюсь это сделать:

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

Но это неправильно ... документация расплывчата ... как это сделать в Jinja2?

Ник Перкинс
источник

Ответы:

170

Начиная с версии 2.6, встроенный фильтр сортировки Jinja2 позволяет вам указать атрибут для сортировки:

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

См. Http://jinja.pocoo.org/docs/templates/#sort

Стив С
источник
Спасибо, это именно то, что я хотел. Кстати, он работает с обоими типами атрибутов ... вы знаете, getattr и getitem ? (потому что я не могу вспомнить, были ли «фильмы» объектами или словарями)
Ник Перкинс
@Nick: Я провел быстрый тест, и, похоже, он работал как с объектами, так и с dicts.
Steve S
2
Отлично, это также работает для индекса кортежа:list_of_tuples|sort(attribute='0')
Navin
Может быть удобно отображать значения в обратном порядке (это может быть интересно, например, для рейтингов), в этом случае просто воспользуйтесь опцией reverse=True.
Romain
25

Если вы хотите отсортировать по возрастанию

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

Если вы хотите отсортировать по убыванию

{% for movie in movie_list|sort(attribute='rating', reverse = True) %}
СуманКальян
источник
14

Обычно мы сортируем список перед тем, как передать его Jinja2. Невозможно указать ключ в sortфильтре Jinja .

Однако всегда можно попробовать {% for movie in movie_list|sort %}. Это синтаксис. Вы не можете предоставить какую-либо ключевую информацию для сортировки.

Вы также можете попробовать написать для этого собственный фильтр. Кажется глупым, когда вы можете выполнить сортировку перед передачей данных Jinja2.

Если movie_listэто список объектов, вы можете определить различные методы сравнения ( __lt__, __gt__и т. Д.) Для класса этих объектов.

Если movie_listэто список кортежей или списков, рейтинг должен быть первым. Или вам придется выполнять сортировку вне Jinja2.

Если movie_listэто список словарей, то вы можете использовать dictsort, который принимает ключевую спецификацию для сортировки. Прочтите это: http://jinja.pocoo.org/2/documentation/templates#dictsort для примера.

С.Лотт
источник
Хорошо, спасибо. Я закончил сортировку в Python перед отправкой в ​​шаблон: <code> movie_list = sorted (movie_list, key = lambda movie: movie.rating, reverse = True) </code> Очень плохо, было бы неплохо позволить шаблону решать в порядке сортировки! (могут ли другие движки шаблонов сделать это?)
Ник Перкинс,
2
Последние версии Jinja2 теперь позволяют указывать атрибут для сортировки.
Steve S
1
@ Стив С: Интересно. Не могли бы вы опубликовать ответ с новой информацией? Включите, пожалуйста, номер версии.
S.Lott
1
Небольшое исправление: после проверки источника я обнаружил, что можно указать индекс в случае, если ваш список состоит из кортежей (например, как возвращаемый dict.items()):sort(attribut='1')
Лукас Кимон,
@SLott - вариант использования сортировки в шаблоне: Это слой отображения, способный отображать несколько представлений одних и тех же данных - это могут быть две отдельные группы. Почему бы снова не проделать эту работу с отображаемым слоем? кажется хорошим местом, чтобы разорвать взаимосвязь проблем.
Шейн С. Мейсон