Шаблоны Django - Печать разделенных запятыми ManyToManyField, сортировка списка результатов в dict? - PullRequest
8 голосов
/ 05 июля 2010

У меня есть проект Django для управления списком журнальных статей.Основная модель Article.Здесь есть различные поля для хранения таких вещей, как название статьи, дата публикации, тема, а также список компаний, упомянутых в статье.(company - это собственная модель).

Мне нужен шаблон, который распечатывает список статей, отсортированных по категориям, а также список упомянутых компаний.

Однако яm две проблемы.

Во-первых, поле company является полем ManyToMany.Сейчас я печатаю это успешно, используя итерацию all, благодаря этому такому вопросу =).(Хотя любопытно, где эта all итеративно документирована в документации Django?)

перечисление объектов из ManyToManyField

Однако я хотел бы напечатать ","(запятая с последующим пробелом) после каждого элемента, , за исключением последнего элемента.Таким образом, результат будет:

Joe Bob Company, Sarah Jane Company, Tool Company

, а не:

Joe Bob Company, Sarah Jane Company, Tool Company,

Как этого добиться с помощью системы шаблонов Django?

Во-вторых, каждый Article имеетCharField с именем category, в котором хранится категория для статьи.Я хотел бы, чтобы статьи сортировались по категориям, если это возможно.Поэтому я использую QuerySet и получаю хороший список соответствующих статей в article_list.Затем я использую шаблонный тег regroup, чтобы отсортировать его по категориям и напечатать каждую.

{ 'tennis': ('article_4', 'article_5')
  'cricket': ('article_2', 'article_3')
  'ping pong': ('article_1')
}

Однако мне нужно убедиться, что мой входной список отсортирован, прежде чем передать его в regroup,У меня вопрос, лучше ли использовать шаблонный тег dictsort для сортировки этого внутри шаблона, или я должен вместо этого использовать order_by вызов QuerySet?

И я предполагаю, что лучше использовать regroupвместо того, чтобы пытаться самому кодировать это в Python внутри представления?

Ура, Виктор

Ответы [ 2 ]

17 голосов
/ 05 июля 2010

первый вопрос

Использовать фильтр соединения типа Python *

{{ article.company.all|join:", " }}

http://docs.djangoproject.com/en/dev/ref/templates/builtins/#join

второй вопрос

У меня такой вопрос, лучше ли использовать шаблонный тег dictsort для сортировки этого внутри шаблона, или я должен вместо этого использовать вызов order_by из QuerySet?

Я бы использовалQuerySet's order_by.Мне нравится делать такие вещи в БД.Так как с огромным набором данных вы можете использовать индексы базы данных.

И я предполагаю, что лучше использовать regroup, чем пытаться самому кодировать это в Python внутри представления?

перегруппировать.Определенно лучше использовать собственные функции Python.

15 голосов
/ 05 июля 2010

Попробуйте forloop.last за первый вопрос

{% for company in article.companys.all %}
  {{company.name}}{% if not forloop.last %}, {% endif %}
{% endfor %}
...