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?

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


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) %}

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.