Apakah mungkin untuk mengurutkan satu set item terkait dalam template DJango?
Yaitu: kode ini (dengan tag HTML dihilangkan untuk kejelasan):
{% for event in eventsCollection %}
{{ event.location }}
{% for attendee in event.attendee_set.all %}
{{ attendee.first_name }} {{ attendee.last_name }}
{% endfor %}
{% endfor %}
menampilkan hampir persis seperti yang saya inginkan. Satu-satunya hal yang ingin saya ubah adalah saya daftar peserta yang akan diurutkan berdasarkan nama belakang. Saya sudah mencoba mengatakan sesuatu seperti ini:
{% for event in events %}
{{ event.location }}
{% for attendee in event.attendee_set.order_by__last_name %}
{{ attendee.first_name }} {{ attendee.last_name }}
{% endfor %}
{% endfor %}
Sayangnya, sintaks di atas tidak berfungsi (menghasilkan daftar kosong) dan juga tidak ada variasi lain yang saya pikirkan (banyak kesalahan sintaks dilaporkan, tetapi tidak ada kegembiraan).
Saya dapat, tentu saja, menghasilkan semacam susunan daftar peserta yang diurutkan menurut pandangan saya, tetapi itu adalah solusi yang jelek dan rapuh (dan apakah saya menyebutkan jelek).
Tak perlu dikatakan lagi, tapi saya akan tetap mengatakannya, saya telah membaca dengan teliti dokumen online dan mencari Stack Overflow dan arsip dari django-user tanpa menemukan sesuatu yang berguna (ah, jika hanya satu set kueri adalah kamus, dictsort akan melakukan pekerjaan, tapi tidak dan tidak)
==============================================
Diedit untuk menambahkan pemikiran tambahan setelah menerima jawaban Tawmas.
Tawmas membahas masalah ini persis seperti yang saya sampaikan - meskipun solusinya tidak seperti yang saya harapkan. Alhasil, saya mempelajari teknik berguna yang juga dapat digunakan dalam situasi lain.
Jawaban Tom mengusulkan pendekatan yang telah saya sebutkan di OP saya dan secara tentatif ditolak sebagai "jelek".
Yang "jelek" adalah reaksi naluriah, dan saya ingin mengklarifikasi apa yang salah dengannya. Dengan melakukan itu saya menyadari bahwa alasan itu adalah pendekatan yang jelek adalah karena saya terpaku pada gagasan untuk meneruskan set kueri ke templat yang akan dirender. Jika saya melonggarkan persyaratan itu, ada pendekatan tidak jelek yang seharusnya berhasil.
Saya belum mencoba ini, tapi anggaplah bahwa bukan lewat queryset, lihat kode iterasi melalui set query menghasilkan daftar Events, kemudian dihiasi setiap acara dengan satu set permintaan untuk yang sesuai peserta yang WS diurutkan (atau disaring, atau apa pun) dengan cara yang diinginkan. Sesuatu seperti itu:
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)
Sekarang templatenya menjadi:
{% for event in events %}
{{ event.location }}
{% for attendee in event.attendee_list %}
{{ attendee.first_name }} {{ attendee.last_name }}
{% endfor %}
{% endfor %}
Sisi negatifnya adalah tampilan harus "mengaktualisasikan" semua peristiwa sekaligus yang bisa menjadi masalah jika ada sejumlah besar peristiwa. Tentu saja seseorang bisa menambahkan pagination, tapi itu memperumit tampilan secara signifikan.
Kelebihannya adalah kode "persiapkan data untuk ditampilkan" dalam tampilan tempatnya membiarkan template fokus pada pemformatan data yang disediakan oleh tampilan untuk ditampilkan. Ini benar dan pantas.
Jadi rencana saya adalah menggunakan teknik tawmas untuk tabel besar dan teknik di atas untuk tabel kecil, dengan definisi besar dan kecil diserahkan kepada pembaca (menyeringai.)
sumber
@property
adalah berlebihan di sini karena tidak ada pengambil atau penyetel yang terlibat: stackoverflow.com/questions/1554546/…Anda dapat menggunakan template filter dictsort https://docs.djangoproject.com/en/dev/ref/templates/builtins/#std:templatefilter-dictsort
Ini harus bekerja:
{% for event in eventsCollection %} {{ event.location }} {% for attendee in event.attendee_set.all|dictsort:"last_name" %} {{ attendee.first_name }} {{ attendee.last_name }} {% endfor %} {% endfor %}
sumber
dictsortreversed
: docs.djangoproject.com/en/dev/ref/templates/builtins/…dictsort
bekerja dengan baik pada kode hampir persis seperti milik Anda. Menariknya tampaknya ini berfungsi dengan baik pada queryset.{% for attendee in event.attendee_set.all|dictsort:"last_name" %}
mengurutkan peserta, tetapi{% for attendee in event.attendee_set.all | dictsort:"last_name" %}
mencoba mengurutkan keluaran for loop dan memutusfor
.Salah satu solusinya adalah membuat templatag kustom:
@register.filter def order_by(queryset, args): args = [x.strip() for x in args.split(',')] return queryset.order_by(*args)
gunakan seperti ini:
{% for image in instance.folder.files|order_by:"original_filename" %} ... {% endfor %}
sumber
regroup seharusnya dapat melakukan apa yang Anda inginkan, tetapi adakah alasan Anda tidak dapat memesannya seperti yang Anda inginkan kembali pada tampilan?
sumber