Jinja2'de bir listeyi nasıl sıralarsınız?


90

Bunu yapmaya çalışıyorum:

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

Ama bu doğru değil ... belgeler belirsiz ... Bunu Jinja2'de nasıl yaparsınız?

Yanıtlar:


172

2.6 sürümünden itibaren, Jinja2'nin yerleşik sıralama filtresi, sıralama için bir öznitelik belirlemenize olanak tanır:

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

Bkz. Http://jinja.pocoo.org/docs/templates/#sort


Teşekkürler, tam da istediğim buydu. Bu arada, her iki tür öznitelikle de çalışıyor mu ... getattr ve getitem'i biliyor musunuz ? (çünkü "filmlerin" nesne mi yoksa sözlük mü olduğunu hatırlayamıyorum)
— Nick Perkins

@Nick: Hızlı bir test yaptım ve hem nesnelerle hem de diktelerle çalışıyor gibiydi.
— Steve S

2
Güzel, bu aynı zamanda bir tuple indeksi için de geçerli:list_of_tuples|sort(attribute='0')
— Navin

Değerleri ters sırayla görüntülemek kullanışlı olabilir (örneğin, derecelendirmeler için ilginç olabilir), bu durumda sadece seçeneği kullanın reverse=True.
— Romain

26

Artan düzende sıralamak istiyorsanız

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

Azalan düzende sıralamak istiyorsanız

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

14

Genellikle listeyi Jinja2'ye vermeden önce sıralarız. Jinja'nın sortfiltresinde bir anahtar belirlemenin bir yolu yok .

Ancak her zaman deneyebilirsiniz {% for movie in movie_list|sort %}. Sözdizimi budur. Sıralama için herhangi bir anahtar bilgi veremezsiniz.

Bunun için özel bir filtre de deneyebilir ve yazabilirsiniz. Verileri Jinja2'ye vermeden önce sıralayabilmeniz aptalca görünüyor.

Eğer movie_listnesnelerin bir listesi, daha sonra çeşitli karşılaştırma yöntemleri (tanımlayabilir __lt__, __gt__bu nesnelerin sınıfı için, vb.)

Eğer movie_listküpe veya listelerin bir listedir, derecelendirme ilk olmalıdır. Ya da sıralamayı Jinja2 dışında yapmanız gerekir.

Bir movie_listsözlükler listesiyse, o zaman kullanabilirsiniz dictsort, bu, sıralama için anahtar bir özelliği kabul eder. Örnek için şunu okuyun: http://jinja.pocoo.org/2/documentation/templates#dictsort .


Tamam teşekkürler. Şablona göndermeden önce Python'da sıralama yaptım: <code> movie_list = sıralanmış (movie_list, key = lambda movie: movie.rating, reverse = True) </code> Çok kötü, şablonun karar vermesine izin vermek güzel olabilir sıralama düzeninde! (diğer şablon motorları bunu yapabilir mi?)
— Nick Perkins

2
Jinja2'nin son sürümleri artık sıralama için bir öznitelik belirlemeye izin veriyor.
— Steve S

1
@Steve S: İlginç. Yeni bilgilerinizle gerçekten bir cevap gönderebilir misiniz ? Lütfen sürüm numarasını ekleyin.
— S.Lott

1
Küçük düzeltme: kaynağı kontrol ettikten sonra , listenizin tuplelardan oluşması durumunda bir indeks belirlemenin mümkün olduğunu öğrendim (örneğin, dönüş olarak dict.items()):sort(attribut='1')
— Lucas Cimon

@SLott - şablonda sıralama için kullanım durumu: Bu, aynı verilerin birden çok görünümünü oluşturabilen görüntü katmanıdır - bunlar iki ayrı ekip olabilir. Bu neden görüntü katmanında tekrar çalışmıyor? Endişelerin birleşimini kırmak için iyi bir yer gibi görünüyor.
— Shane C. Mason
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.