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()
<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
кэшируются для всего дерева)