我使用的是Django 3.2和Django -mppt 0.13.4
这是我的(简化)模型:
/路径//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
/路径//myapp/views.py
class ArticleDetailView(DetailView):
model = 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>
/道路//myapp/模板/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
变量匹配直接从DB获得的,但子元素在模板中是空集-而当直接访问数据库时,返回正确的(直接)子元素数量。
为什么模板没有正确返回注释的子元素-我如何解决这个问题?
不需要修复,因为它可以正常工作。请仔细阅读以下提示https://django-mptt.readthedocs.io/en/latest/templates.html
注意特殊变量
node
和children
。这些都很神奇当你在recursetree
标签内时插入到你的上下文中。
node
是MPTT模型的一个实例。
children
:该变量保存为的子元素呈现的HTML节点。
得到mptt_tags.py
的评论
遍历树中的节点,并呈现包含的块对于每个节点。这个标签将递归地将子节点呈现到模板变量
{{ children }}
中。只需要一个数据库查询(children
为整个树缓存)
我得到了以下正确的结果。
<li> comment1 2 Replies <ul class="children"> <li>comment3 1 Replies <ul class="children"> <li> comment4 </li> </ul> </li> </ul> </li>