Чи можна відсортувати набір пов’язаних елементів у шаблоні 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-user, не знайшовши нічого корисного (ах, якби лише набір запитів був би словниковий диктот, робота, але це не так і ні)
==================================================
Відредаговано, щоб додати додаткові думки після прийняття відповіді Таумаса.
Таумас вирішив проблему саме так, як я її представив - хоча рішення було не таким, як я очікував. В результаті я навчився корисній техніці, яку можна використовувати і в інших ситуаціях.
У відповіді Тома був запропонований підхід, про який я вже згадував у своєму OP та попередньо відхилив як "потворний".
"Потворна" була реакцією кишечника, і я хотів уточнити, що з цим не так. Роблячи це, я зрозумів, що причиною цього був потворний підхід у тому, що мене зависла ідея передати набір запитів шаблону, який буде відтворений. Якщо я зменшу цю вимогу, існує некрасивий підхід, який повинен спрацювати.
Я не пробував цього, але припущу , що замість проходження QuerySet, вид код ітерації через набір запитів виробляє список подій, потім прикрашений кожна подія з набором запитів для відповідних учасників , які БУЛИ відсортовані (або фільтрується, або що завгодно) бажаним способом. Приблизно так:
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 %}
Недоліком є те, що погляд повинен "актуалізувати" всі події одночасно, що може бути проблемою, якщо буде велика кількість подій. Звичайно, можна додати пагінацію, але це значно ускладнює погляд.
Головною стороною є код "підготувати дані до відображення" у поданні, де він належить, дозволяючи шаблону зосередитись на форматуванні даних, представлених видом для відображення. Це правильно і правильно.
Тож мій план полягає у використанні техніки Таумаса для великих столів та вищезазначеної техніки для маленьких столів, з визначенням великого та малого, що залишається читачеві (посміхається)