เป็นไปได้ไหมที่จะจัดเรียงชุดรายการที่เกี่ยวข้องในเทมเพลต DJango
นั่นคือ: รหัสนี้ (ที่ละไว้แท็ก HTML เพื่อความชัดเจน):
{% for event in eventsCollection %}
{{ event.location }}
{% for attendee in event.attendee_set.all %}
{{ attendee.first_name }} {{ attendee.last_name }}
{% endfor %}
{% endfor %}
แสดงเกือบจะตรงกับที่ฉันต้องการ สิ่งเดียวที่ฉันต้องการเปลี่ยนคือฉันรายชื่อผู้เข้าร่วมที่จะจัดเรียงตามนามสกุล ฉันได้ลองพูดสิ่งนี้แล้ว:
{% for event in events %}
{{ event.location }}
{% for attendee in event.attendee_set.order_by__last_name %}
{{ attendee.first_name }} {{ attendee.last_name }}
{% endfor %}
{% endfor %}
อนิจจาไวยากรณ์ข้างต้นใช้ไม่ได้ (สร้างรายการว่างเปล่า) และไม่มีรูปแบบอื่นใดที่ฉันคิดไว้ (รายงานข้อผิดพลาดทางไวยากรณ์จำนวนมาก แต่ไม่มีความสุข)
แน่นอนฉันสามารถสร้างรายชื่อผู้เข้าร่วมที่จัดเรียงไว้ในมุมมองของฉันได้ แต่นั่นเป็นวิธีแก้ปัญหาที่น่าเกลียดและเปราะบาง (และฉันพูดถึงวิธีที่น่าเกลียดหรือไม่)
ไม่จำเป็นต้องพูด แต่ฉันจะพูดต่อไปฉันได้อ่านเอกสารออนไลน์และค้นหา Stack Overflow และที่เก็บถาวรของผู้ใช้ django โดยไม่พบสิ่งใดที่เป็นประโยชน์ (อ่าถ้ามีเพียงชุดการสืบค้นเป็นคำสั่งพจนานุกรมเท่านั้นที่จะทำ งาน แต่มันไม่ใช่และมันไม่)
==============================================
แก้ไขเพื่อเพิ่มความคิดเพิ่มเติมหลังจากยอมรับคำตอบของ Tawmas
Tawmas แก้ไขปัญหาตรงตามที่ฉันนำเสนอ - แม้ว่าวิธีแก้ปัญหาจะไม่ใช่สิ่งที่ฉันคาดหวังก็ตาม ด้วยเหตุนี้ฉันจึงได้เรียนรู้เทคนิคที่มีประโยชน์ซึ่งสามารถนำไปใช้ในสถานการณ์อื่น ๆ ได้เช่นกัน
คำตอบของทอมเสนอแนวทางที่ฉันได้กล่าวไปแล้วใน OP ของฉันและปฏิเสธอย่างไม่เป็นทางการว่า "น่าเกลียด"
"น่าเกลียด" เป็นปฏิกิริยาทางเดินอาหารและฉันต้องการชี้แจงว่าเกิดอะไรขึ้น ในการทำเช่นนั้นฉันตระหนักว่าเหตุผลที่มันเป็นแนวทางที่น่าเกลียดเป็นเพราะฉันติดอยู่กับความคิดที่จะส่งแบบสอบถามที่ตั้งค่าไปยังเทมเพลตที่จะแสดงผล หากฉันผ่อนคลายความต้องการนั้นมีวิธีการที่ไม่น่าเกลียดที่ควรได้ผล
ฉันยังไม่ได้ลองสิ่งนี้ แต่สมมติว่าแทนที่จะส่งแบบสอบถามรหัสมุมมองจะวนซ้ำผ่านชุดแบบสอบถามที่สร้างรายการเหตุการณ์จากนั้นตกแต่งแต่ละเหตุการณ์ด้วยชุดแบบสอบถามสำหรับผู้เข้าร่วมที่เกี่ยวข้องซึ่งเรียงลำดับWAS (หรือกรองแล้ว หรืออะไรก็ได้) ในแบบที่ต้องการ สิ่งที่ต้องการ:
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)
ตอนนี้เทมเพลตกลายเป็น:
{% for event in events %}
{{ event.location }}
{% for attendee in event.attendee_list %}
{{ attendee.first_name }} {{ attendee.last_name }}
{% endfor %}
{% endfor %}
ข้อเสียคือมุมมองต้อง "เข้าใจ" เหตุการณ์ทั้งหมดในคราวเดียวซึ่งอาจเป็นปัญหาได้หากมีเหตุการณ์จำนวนมาก แน่นอนว่าเราสามารถเพิ่มเลขหน้าได้ แต่จะทำให้มุมมองซับซ้อนขึ้นมาก
ด้านบนคือโค้ด "เตรียมข้อมูลที่จะแสดง" อยู่ในมุมมองที่เป็นของโดยให้เทมเพลตมุ่งเน้นไปที่การจัดรูปแบบข้อมูลที่ได้รับจากมุมมองสำหรับการแสดงผล นี่คือสิ่งที่ถูกต้องและเหมาะสม
ดังนั้นแผนของฉันคือใช้เทคนิคของ Tawmas สำหรับตารางขนาดใหญ่และเทคนิคข้างต้นสำหรับตารางขนาดเล็กโดยมีคำจำกัดความของขนาดใหญ่และขนาดเล็กให้กับผู้อ่าน (ยิ้ม)