Как создать список, упорядоченный по полю manyToMany, и отобразить его, используя {% ifchanged%} в шаблоне? - PullRequest
0 голосов
/ 19 ноября 2009

У меня есть две модели, EqTD (EquivalentTextDescription) и местоположение. EqTD имеет много отношения к местоположению. Мне нужно составить список всех EqTD, упорядоченных по имени местоположения («имя» - это поле в модели местоположения). Я получаю набор запросов EqTD таким образом:

tEqTDs = EqTD.objects.order_by('location__name')

, который, я надеюсь, создаст дубликаты, если они существуют, когда один и тот же EqTD связан с несколькими местоположениями.

В шаблоне HTML я хочу использовать {% ifchanged%}, чтобы поместить заголовок с именем местоположения над каждой группой EqTD. Тем не менее, этот код:

{% for eqtd in object_list %}
 {% ifchanged %}
   <tr><td  colspan="2"><h3>
   {{ eqtd.location.name }} 
   </h3></td></tr>
 {% endifchanged %}
  ...
{% endfor %}

ничего не выводит. Я понял, что eqtd.location.name, вероятно, бессмысленно. В каком месте?

Было предложено использовать annotate () для добавления имени местоположения к каждому элементу в наборе запросов, например:

tEqTDs = EqTD.objects.annotate( eqtd_loc = 'location__name').order_by('eqtd_loc')

но это приводит к ошибке атрибута: объект 'str' не имеет атрибута 'lookup'.

Неужели annotate () ожидает вызова?

Этот должен быть общим шаблоном. Что за ключ?

1 Ответ

0 голосов
/ 19 ноября 2009

Я не знаю, что заказ от многих ко многим - отличная идея. см здесь

вместо этого, возможно, будет лучше запросить все ваши местоположения, затем выполнить итерацию по ним, напечатать заголовок, а затем выполнить итерацию по их объектам EqTD в EqTD_set.all ()

{% for location in object_list %}
   <tr><td  colspan="2"><h3>
   {{ location.name }} 
   </h3></td></tr>
    {% for eqtd in location.eqtd_set.all %}
        ...
    {% endfor %}
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...