Django использует тег перегруппировки - PullRequest
0 голосов
/ 05 декабря 2018

Я бы хотел использовать тег 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>]})

Большое спасибо, если вы можете мне помочь

...