Como você classifica uma lista no Jinja2?

88

Estou tentando fazer isso:

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

Mas isso não está certo ... a documentação é vaga ... como você faz isso no Jinja2?

Nick Perkins
fonte

Respostas:

170

A partir da versão 2.6, o filtro de classificação integrado do Jinja2 permite que você especifique um atributo para classificar:

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

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

Steve S
fonte
Obrigado, era exatamente o que eu queria. A propósito, funciona com os dois tipos de atributos ... você conhece getattr e getitem ? (porque não consigo me lembrar se "filmes" eram objetos ou dicionários)
Nick Perkins
@ Nick: Fiz um teste rápido e pareceu funcionar tanto com objetos quanto com dados.
Steve S de
2
Legal, isso também funciona para um índice de tupla:list_of_tuples|sort(attribute='0')
Navin
Pode ser útil exibir os valores em ordem reversa (pode ser interessante para avaliações, por exemplo), neste caso apenas use a opção reverse=True.
Romain
25

Se você deseja classificar em ordem crescente

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

Se você deseja classificar em ordem decrescente

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

Normalmente, classificamos a lista antes de entregá-la ao Jinja2. Não há como especificar uma chave no sortfiltro de Jinja .

No entanto, você sempre pode tentar {% for movie in movie_list|sort %}. Essa é a sintaxe. Você não pode fornecer nenhum tipo de informação chave para a classificação.

Você também pode tentar escrever um filtro personalizado para isso. Parece bobagem quando você pode classificar antes de fornecer os dados ao Jinja2.

Se movie_listé uma lista de objetos, então você pode definir os vários métodos de comparação ( __lt__, __gt__, etc.) para a classe desses objetos.

Se movie_listfor uma lista de tuplas ou listas, a classificação deve ser a primeira. Ou você terá que fazer a classificação fora de Jinja2.

Se movie_listfor uma lista de dicionários, você pode usar o dictsort, que aceita uma especificação de chave para a classificação. Leia isto: http://jinja.pocoo.org/2/documentation/templates#dictsort para obter um exemplo.

S.Lott
fonte
Ok, obrigado. Acabei classificando em Python antes de enviar para o modelo: <code> movie_list = Sort (movie_list, key = lambda movie: movie.rating, reverse = True) </code> Que pena, pode ser bom deixar o modelo decidir na ordem de classificação! (outros mecanismos de modelo poderiam fazer isso?)
Nick Perkins
2
As versões recentes do Jinja2 agora permitem especificar um atributo pelo qual classificar.
Steve S
1
@Steve S: Interessante. Você poderia postar uma resposta com suas novas informações? Inclua o número da versão, por favor.
S.Lott
1
Pequena correção: após verificar a fonte descobri que é possível especificar um índice caso sua lista seja composta por tuplas (por exemplo, como retorno de dict.items()):sort(attribut='1')
Lucas Cimon
@SLott - o caso de uso para classificação no modelo é: Esta é a camada de exibição - capaz de renderizar várias visualizações dos mesmos dados - podem ser duas equipes separadas. Por que não fazer isso na camada de exibição novamente? parece um bom lugar para quebrar o acoplamento de preocupações.
Shane C. Mason