2009-12-22 88 views
0

几天前,我正在搞Django,试图感受一下东西是如何工作的,当我决定尝试构建一个简单的论坛时,它类似于一个论坛,我经常光顾(但现在关闭)。当时的想法是,每个评论的是父母任意数量的评论,就像这样:Django - 使用树建立一个评论系统

comment <--top 
    comment <-- comment "A" 
    comment <-- comment "B" 
    comment <-- comment "C" 
    comment <--C-1, reply to comment "C" 
     comment <-- C-1-1, reply to comment "C-1" 
     comment 
      comment 
      comment 
     comment <-- C-1-1-1 reply to C-1-1 
     comment 
     comment 
      comment 
      comment 
    comment 
    comment 
     comment 
     comment 
      comment 
      comment 
      comment 
      comment 

这里的想法是,回复评论会酿下的每个评论一个级别,并且,除的第一个评论,有一位家长。事情是,虽然我得到了实现树遍历的想法,但是我没有读过关于这个主题的书/文章,并且考虑到了Django(或者MVC模式),所以我的问题是如何去做在Django中实现这个系统? (这里的型号代码,我已经有了一个参考: - /)

class Comment(models.Model): 
Parent = models.OneToOneField('self', null=True) 
Children = models.ForeignKey('self', null=True) 

Author = models.ForeignKey(User) 
     Author_IP = models.IPAddressField() 
Created_On = models.DateTimeField(auto_now_add=True) 
Modified_On = models.DateTimeField(auto_now=True) 
Body = models.TextField() 
+0

在档案中搜索,你可以找到很多答案。 http://stackoverflow.com/search?q=django+tree – 2009-12-22 16:27:45

回答

2

看看django-threadedcomments。它的目的是更适合用作博客上的评论而不是全功能论坛,但如果它不适合您的情况,您至少可以查看源代码并从中学习一些东西。

至于基于树的结构去,有三个项目,我知道了Django的ORM:django-mptt(这其中有与第三方Django的最大的“市场份额”应用据我所知),django-treebeard,并easytree(这是基于treebeard)。 Easytree带有一个很好的管理界面,但另外两个项目至少在其问题追踪器中有补丁来添加管理界面(不知道他们是否已经整合了这些补丁)。

1

我只定义了父母,并给它一个相关的名字

class Comment(models.Model): 
    parent=models.ForeignKey('self', related_name="children", null=True, blank=True) 
    #other fields 

然后,你可以得到它的孩子

comment=Comment.objects.get(id=1) 
children=comment.children.all() 

for child in children: 
    morechildren=child.children.all() 
+0

所以我已经定义的“儿童”字段不再需要? – cornjuliox 2009-12-22 16:57:17