Сортировка связанных элементов в шаблоне Django



можно ли сортировать набор связанных элементов в шаблоне 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 %}


увы, приведенный выше синтаксис не работает (он создает пустой список), и ни один другой вариация, о которой я думал (много синтаксических ошибок, но без радости).



Я мог бы, конечно, создать какой-то массив отсортированных списков участников, на мой взгляд, но это уродливое и хрупкое (и я упоминал уродливое) решение.



Излишне говорить, но я все равно скажу, что я просмотрел он-лайн документы и искал переполнение стека и архивы django-user, не найдя ничего полезного (Ах, если бы только набор запросов был словарем, диктсорт сделал бы эту работу, но это не так и это не так)



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



отредактировано для добавления дополнительных мыслей
после принятия ответа Таумаса.





Tawmas обратился к вопросу именно так, как я его представил-хотя решение было не то, что я ожидал. В результате я узнал полезную технику, которая может быть использована и в других ситуациях.



ответ Тома предложил подход, который я уже упоминал в своей ОП и ориентировочно отвергнут как "уродливый".



"уродливый" была реакция кишечника, и я хотел уточнить, что было не так с ним. При этом я понял, что причина, по которой это был уродливый подход, заключалась в том, что я был зациклен на идее передачи набора запросов в шаблон для визуализации. Если я ослаблю это требование, есть некрасивый подход, который должен работать.



Я еще не пробовал это, но предположим, что вместо передачи 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 %}


недостатком является то, что представление должно "актуализировать" все события сразу, что может быть проблемой, если бы было большое количество событий. Конечно, можно добавить разбиение на страницы, но это усложняет представление значительно.



верх-это код" подготовить данные для отображения " в представлении, где он принадлежит позволяя шаблону сосредоточиться на форматировании данных, предоставляемых представлением для отображения. Это правильно и правильно.



таким образом, мой план заключается в использовании техники Tawmas для больших таблиц и выше техника для малых
таблицы, с определением большого и малого оставлены читателю (усмешка.)

698   3  

3 ответов:

вы должны указать порядок в модели участника, как это. Например (предполагая, что ваш класс модели называется участник):

class Attendee(models.Model):
    class Meta:
        ordering = ['last_name']

посмотреть руководство для дальнейшего использования.

EDIT. Другим решением является добавление свойства в модель событий, доступ к которому можно получить из шаблона:

class Event(models.Model):
# ...
@property
def sorted_attendee_set(self):
    return self.attendee_set.order_by('last_name')

вы можете определить больше из них, как вам это нужно...

вы можете использовать шаблон filter dictsort https://docs.djangoproject.com/en/dev/ref/templates/builtins/#std:templatefilter-dictsort

Это должно работать:

{% for event in eventsCollection %}
   {{ event.location }}
   {% for attendee in event.attendee_set.all|dictsort:"last_name" %}
     {{ attendee.first_name }} {{ attendee.last_name }}
   {% endfor %}
 {% endfor %}

перегруппироваться должен быть в состоянии делать то, что вы хотите, но есть ли причина, по которой вы не можете заказать их так, как вы хотите обратно в представлении?

Comments

    Ничего не найдено.