Як сортувати список у 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 ? (тому що я не можу згадати, чи були "фільми" предметами чи словниками)
Нік Перкінс,

@ Нік: Я зробив швидкий тест, і він, здавалося, працював як з об’єктами, так і з диктами.
Steve S

2
Приємно, це також працює для індексу кортежу:list_of_tuples|sort(attribute='0')
Navin

Може бути зручно відображати значення в зворотному порядку (це може бути цікаво для рейтингів), у цьому випадку просто скористайтеся опцією reverse=True.
Ромен

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
@Steve S: Цікаво. Чи можете ви насправді опублікувати відповідь зі своєю новою інформацією? Вкажіть номер версії, будь ласка.
S.Lott

1
Невелике виправлення: після перевірки джерела я з’ясував, що можна вказати індекс на випадок, якщо ваш список складається із кортежів (наприклад, як повернення dict.items()):sort(attribut='1')
Лукас Сімон

@SLott - варіант використання для сортування в шаблоні такий: Це рівень дисплея - здатний рендерити кілька видів одних і тих самих даних - це можуть бути дві окремі команди. Чому б це не зробити знову на шарі відображення? здається хорошим місцем, щоб розірвати поєднання проблем.
Шейн К. Мейсон,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.