Verwandte Elemente in einer Django-Vorlage sortieren

Ist es möglich, zu Sortieren, eine Gruppe von zusammenhängenden Elementen in eine DJango-template?

Ist: diesen code (mit HTML-tags aus Gründen der übersichtlichkeit weggelassen):

{% for event in eventsCollection %}
   {{ event.location }}
   {% for attendee in event.attendee_set.all %}
     {{ attendee.first_name }} {{ attendee.last_name }}
   {% endfor %}
 {% endfor %}

zeigt fast genau ich möchte. Das einzige, was ich ändern möchte ist, dass ich die Liste der Teilnehmer sortiert nach Nachnamen. Ich habe versucht, etwas zu sagen wie:

{% for event in events %}
   {{ event.location }}
   {% for attendee in event.attendee_set.order_by__last_name %}
     {{ attendee.first_name }} {{ attendee.last_name }}
   {% endfor %}
 {% endfor %}

Ach, die obige syntax funktioniert nicht (es erzeugt eine leere Liste), und auch nicht jede andere Variante, die ich gedacht haben (viele syntax-Fehler gemeldet, aber auch keine Freude).

Konnte ich, natürlich, erzeugen eine Art von array von sortierten Teilnehmer-Listen aus meiner Sicht, aber das ist eine hässliche und zerbrechlich (und habe ich schon erwähnt, hässliche) Lösung.

Unnötig zu sagen, aber ich sage es trotzdem, ich habe schon durchgelesen die Online-docs gesucht und Stack Overflow und die Archive der django-user ohne etwas zu finden, hilfreich (ach, wenn nur eine Abfrage festgelegt wurden, ein Wörterbuch dictsort würde den job tun, aber es ist nicht und es nicht tut)

==============================================

Bearbeitet, um zusätzliche Gedanken
nach der Annahme Tawmas Antwort.


Tawmas hat die Frage genau so, wie ich ihn vorgestellt -- obwohl die Lösung war nicht das, was ich erwartet hatte. Als Ergebnis habe ich gelernt, eine nützliche Technik, die verwendet werden können in anderen Situationen auch.

Tom ' s Antwort vorgeschlagen, ein Ansatz, den ich schon erwähnt hatte in meinem OP und vorläufig zurückgewiesen, als "hässlich".

Dem "hässlich" war eine spontane Reaktion, und ich wollte klären, was falsch war mit ihm. Dabei merkte ich, dass der Grund, es war ein hässlicher Ansatz war, weil ich hängte auf der Idee der übergabe einer Abfrage an die Vorlage gerendert werden. Wenn ich mich entspanne,, Anforderung, es ist ein un-hässlich Ansatz, der funktionieren sollte.

Ich dies noch nicht ausprobiert, nehme aber an, dass anstatt der queryset, das anzeigen-code iteriert durch die Abfrage produziert eine Liste der Ereignisse, die dann verziert mit jedem Ereignis eine Abfrage für die entsprechenden Teilnehmer, die WAR sortiert (oder gefiltert, oder was auch immer) in der gewünschten Weise. So etwas wie so:

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)

Nun die Vorlage wird:

{% for event in events %}
   {{ event.location }}
   {% for attendee in event.attendee_list %}
     {{ attendee.first_name }} {{ attendee.last_name }}
   {% endfor %}
 {% endfor %}

Die Kehrseite der Medaille ist die Ansicht auf die Schaltfläche "aktualisieren" werden alle Ereignisse auf einmal, das könnte ein problem werden, wenn es große Anzahl von Veranstaltungen. Natürlich könnte man hinzufügen, Paginierung, aber das erschwert die Sicht erheblich.

Den Kopf, ist die "Aufbereitung der Daten angezeigt werden soll" code in der Ansicht, wo es hingehört, lassen Sie die Vorlage konzentrieren sich auf die Formatierung der Daten, die durch die Ansicht für die Anzeige. Dies ist richtig und angemessen.

Also mein plan ist, Tawmas' Technik für große Tabellen und die oben genannten Technik für kleine
Tabellen, die mit der definition des großen und kleinen linken an den Leser (grins.)

InformationsquelleAutor der Frage Dale Wilson | 2011-06-30

Schreibe einen Kommentar