Django-mptt модель дерева возвращает пустые дочерние элементы в шаблоне, используя recursetree

Я использую Django 3.2 и django-mppt 0.13.4

Вот моя (упрощенная) модель:

/path/to/myapp/models.py

class Comment(MPTTModel, MyTimestampedModel):

    parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True,  related_name='children')

    content = models.TextField(default='')
    markdown_content = models.TextField(default='')

    attachment = models.ImageField()     


    class MPTTMeta:
        order_insertion_by = ['created_at']

    class Meta:
        permissions = [('can_moderate_comments', 'Can moderate comments'),
                       ('can_attach_file', 'Can attach file'),]


class Commentable(models.Model, Foo):
    accept_comments = models.BooleanField(default=True, blank=True)    
    comments = GenericRelation(Comment)
    
    # ... other fields


class Article(Commentable, FooBar):
    pass

/path/to/myapp/views.py

class ArticleDetailView(DetailView): модель = Article

def get_context_data(self, **kwargs):
    context = super(ArticleDetailView, self).get_context_data(**kwargs)
             
    article = self.get_object()
    # ....

    context['comments'] = article.comments.all() 

Из документации mptt

<ul class="root">
    {% recursetree nodes %}
        <li>
            {{ node.name }}
            {% if not node.is_leaf_node %}
                <ul class="children">
                    {{ children }}
                </ul>
            {% endif %}
        </li>
    {% endrecursetree %}
</ul>

/path/to/myapp/templates/myapp/article_detail.html

       {% recursetree comments %}
           <li>
                 {{ node.markdown_content }}
                 {% if not node.is_leaf_node %}
                    {{node.get_descendant_count}} Replies
                    <ul class="children">
                    {{ children }} 
                    </ul>
                 {% endif %}
           </li>            
        {% endrecursetree %}  

Я добавляю в базу данных три комментария (с помощью команды shell), со следующим иерархическим отношением:

Comment 1 (id=1)
  Reply To Comment 1 (id=3)
    Reply To Reply to Comment 1 (id=4)
Comment 2 (id=2)

Когда я ввожу следующее в командной строке:

Comment.objects.filter(id=1).get_children() 
=> 1

Comment.objects.filter(id=1).get_descendent_count()
=> 2

Однако (пока фокусируясь только на первом комментарии), в моем шаблоне, хотя переменная node.get_descendant_count соответствует переменной, полученной непосредственно из БД, дочерние элементы являются нулевым набором в шаблоне - тогда как при прямом обращении к БД возвращается правильное количество (прямых) дочерних элементов.

Почему шаблон не возвращает дочерние элементы комментария правильно - и как это исправить?

Нет необходимости исправлять, так как он работает правильно. Пожалуйста, внимательно прочитайте следующие заметки из https://django-mptt.readthedocs.io/en/latest/templates.html

Обратите внимание на специальные переменные node и children. Они волшебным образом вставляются в ваш контекст, пока вы находитесь внутри тега recursetree.

node - это экземпляр вашей модели MPTT.

children : В этой переменной хранится отрисованный HTML для дочерних элементов node.

И получил комментарий от mptt_tags.py.

Перебирает узлы в дереве и отображает содержащийся блок для каждого узла. Этот тег рекурсивно выводит дочерние блоки в переменную шаблона {{ children }}. Требуется только один запрос к базе данных (children кэшируются для всего дерева)

Вернуться на верх