django-mptt树模型在模板中使用递归树返回空子节点



我使用的是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

注意特殊变量nodechildren。这些都很神奇当你在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>

相关内容

  • 没有找到相关文章

最新更新