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.