Я бы хотел использовать тег Django с именем regroup
для сортировки моих объектов и связанных объектов.Это первый раз, когда я использую этот тег, и мне нужна ваша помощь, потому что я не могу разобрать свой набор запросов.
Я хотел бы получить что-то вроде этого:
- Category 1
- Publication 1
- Document 1
- Document 2
- Publication 2
- Document 1
- Category 2
- Publication 3
- Document 1
- Category 3
- Publication 4
- Document 1
- Document 2
Как видите, для каждой категории я отображаю связанные публикации.Затем для общих публикаций я отображаю связанные документы.
Я хотел бы использовать для этого тег regroup
.
Мой model.py внешний вид файланапример:
class Category(EdqmTable):
name = models.CharField(max_length=200, verbose_name=_('name'), unique=True, null=False)
class Publication(EdqmTable):
pub_id = models.CharField(max_length=10, verbose_name=_('publication ID'), unique=True, default='')
title = models.CharField(max_length=512, verbose_name=_('title'), null=False, unique=True)
category = models.ForeignKey(Category, verbose_name=_('category'), null=False, related_name='publication')
class Document(EdqmTable):
code = models.CharField(max_length=25, verbose_name=_('code'), unique=True, null=False, blank=False)
language = models.CharField(max_length=2, verbose_name=_('language'), choices=LANGUAGE_CHOICES, null=False, blank=False)
format = models.CharField(max_length=10, verbose_name=_('format'), choices=FORMAT_CHOICES, null=False, blank=False)
title = models.CharField(max_length=512, verbose_name=_('title'), null=False, blank=False)
publication = models.ForeignKey(Publication, verbose_name=_('publication title'), related_name='documents')
Каждый класс связан с другими благодаря ForeignKey
: Category to Publication
и Publication to Document
.
В моем файле views.py У меня есть:
# By default, display documents
test_research = Document.objects.all().order_by('publication__category__name')
kwargs['test_research'] = test_research
research_categories = defaultdict(list)
for element in test_research:
research_categories[element.publication.category].append(element)
research_publications = defaultdict(list)
for element in test_research:
research_publications[element.publication].append(element)
kwargs['test_research'] = test_research
kwargs['research_categories'] = research_categories
kwargs['research_publications'] = research_publications
И я попытался упростить мой шаблон Django :
{% for category in research_categories|dictsort:'name' %}
{{ category }} <!-- Display categories -->
{% for document in test_research %} <!-- Display publications associated to each category -->
{% if document.publication.category|stringformat:"s" == category|stringformat:"s" %}
{{ document.publication }}
{% regroup document by document.publication as publication_list %} <!-- Display documents associated to each publication -->
<ul>
{% for document.publication in publication_list %}
<li>{{ document.publication.grouper }}
<ul>
{% for doc in document.publication.list %}
<li>{{ doc.title }}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
{% endif %}
{% endfor %}
{% endfor %}
Я получил эту проблему:
Значение исключения: объект «Документ» не повторяется
Это печать из представлений:
#test_research
<QuerySet [<Document: document n°1>, <Document: TEST document 2>, <Document: document 1>, <Document: document 1>, <Document: document 1>]>
#research_categories
defaultdict(<class 'list'>, {<Category: CATEGORY N°1>: [<Document: document n°1>, <Document: TEST document 2>], <Category: CATEGORY N°2>: [<Document: document 1>], <Category: CATEGORY N°3>: [<Document: document 1>], <Category: TEST>: [<Document: document 1>]})
#research_publications
defaultdict(<class 'list'>, {<Publication: Publication n°1 (PUBSD-0001)>: [<Document: document n°1>, <Document: TEST document 2>], <Publication: Publication n°2 (PUBSD-0002)>: [<Document: document 1>], <Publication: Publication n°3 (PUBSD-0003)>: [<Document: document 1>], <Publication: Test validators (PUBSD-0004)>: [<Document: document 1>]})
Большое спасибо, если вы можете мне помочь