Bir DJango şablonunda bir dizi ilgili öğeyi sıralamak mümkün müdür?
Yani: bu kod (açıklık için HTML etiketleri çıkarılmıştır):
{% for event in eventsCollection %}
{{ event.location }}
{% for attendee in event.attendee_set.all %}
{{ attendee.first_name }} {{ attendee.last_name }}
{% endfor %}
{% endfor %}
ekranlar neredeyse aynen istiyorum. Değiştirmek istediğim tek şey, soyadına göre sıralanacak katılımcılar listesidir. Bunun gibi bir şey söylemeyi denedim:
{% for event in events %}
{{ event.location }}
{% for attendee in event.attendee_set.order_by__last_name %}
{{ attendee.first_name }} {{ attendee.last_name }}
{% endfor %}
{% endfor %}
Ne yazık ki, yukarıdaki sözdizimi çalışmıyor (boş bir liste oluşturuyor) ve düşündüğüm başka bir varyasyon da yok (çok sayıda sözdizimi hatası bildirildi, ancak neşe yok).
Elbette, benim görüşüme göre bir dizi sıralı katılımcı listesi üretebilirdim, ancak bu çirkin ve kırılgan (ve çirkin) bir çözümden bahsetmiştim.
Söylemeye gerek yok, ama yine de söyleyeceğim, yararlı hiçbir şey bulmadan çevrimiçi belgeleri inceledim ve Stack Overflow ve django-user arşivlerini araştırdım (ah, eğer sadece bir sorgu kümesi bir sözlük olsaydı dictsort bunu yapardı iş, ama değil ve değil)
============================================
Tawmas'ın cevabını kabul ettikten sonra ek düşünceler eklemek için düzenlendi.
Tawmas sorunu tam olarak benim sunduğum gibi ele aldı - ancak çözüm beklediğim gibi değildi. Sonuç olarak, başka durumlarda da kullanılabilecek yararlı bir teknik öğrendim.
Tom'un cevabı OP'mde daha önce bahsettiğim ve "çirkin" olduğu için geçici olarak reddettiğim bir yaklaşım önerdi.
"Çirkin" bir içgüdüsel tepkiydi ve bunda neyin yanlış olduğunu açıklığa kavuşturmak istedim. Bunu yaparken, bunun çirkin bir yaklaşım olmasının sebebinin, işlenecek şablona bir sorgu seti geçirme fikrine takılıp kalmış olmam olduğunu fark ettim. Bu gereksinimi gevşetirsem, işe yaraması gereken çirkin bir yaklaşım vardır.
Bunu henüz denemediyseniz, daha ziyade Sorgu Kümesi geçen daha, görünüm kod Olaylar, daha sonra ilgili katılımcılar için bir sorgu seti ile her Olay dekore bir liste üreten sorgu kümesi yineledi varsayalım değil WAS , sıralı (veya filtrelenmiş ya da her neyse) istenen şekilde. Öyle bir şey:
eventCollection = []
events = Event.object.[filtered and sorted to taste]
for event in events:
event.attendee_list = event.attendee_set.[filtered and sorted to taste]
eventCollection.append(event)
Şimdi şablon şu hale gelir:
{% for event in events %}
{{ event.location }}
{% for attendee in event.attendee_list %}
{{ attendee.first_name }} {{ attendee.last_name }}
{% endfor %}
{% endfor %}
Dezavantajı ise, görüşün tüm olayları aynı anda "gerçekleştirmesi" gerektiğidir ve bu, çok sayıda olay olması durumunda sorun olabilir. Elbette sayfalandırma da eklenebilir, ancak bu görünümü oldukça karmaşık hale getirir.
Bunun tersi, "görüntülenecek verileri hazırlayın" kodunun ait olduğu görünümde olması, şablonun, görünüm tarafından görüntülenmek üzere sağlanan verileri biçimlendirmeye odaklanmasını sağlar. Bu doğru ve uygun.
Bu yüzden planım, büyük tablolar için Tawmas tekniğini ve küçük tablolar için yukarıdaki tekniği, okuyucuya bırakılan büyük ve küçük tanımıyla (sırıtma) kullanmaktır.