django中的多线程对话(如Reddit)
我有一个应用程序,基本上是一个会话系统(很像reddit).
如果帖子可以有多个回复,回复并且有多个回复,并且对回复的回复可以有多个回复(等等) 我做了这样的模型: class Discussion(models.Model): message = models.TextField() replies = models.ManyToManyField('self') 和观点: discussions = Discussions.objects.all() 模板看起来像这样: {% for discussion in discussions %} {{ discussion.message }} {% endfor %} 我如何建立一个系统,我可以输出这样的所有回复? discussion reply reply reply reply reply reply 哪个会在确保列出所有回复时尽可能降低. 解决方法
除非回复可以是对多个帖子的回复,否则ManyToManyField不是您想要的.你只需要一个ForeignKey:
class Discussion(models.Model): message = models.TextField() reply_to = models.ForeignKey('self',related_name='replies',null=True,blank=True) 然后,您可以使用Discussion.replies进行讨论的回复. 不幸的是,没有办法在Django的模板语言中进行递归,所以你必须要么1)运行一个递归函数来获得一个“扁平”的回复列表,并把它放在上下文中,或者2)编写一个可以执行的函数被称为递归调用,使用模板生成每个级别,如下所示: _DiscussionTemplate = Template(""" <li>{{ discussion.message }}{% if replies %} <ul> {% for reply in replies %} {{ reply }} {% endfor %} </ul> {% endif %}</li> """.strip()) class Discussion(models.Model): message = models.TextField() reply_to = models.ForeignKey('self',blank=True) @property def html(self): return _DiscussionTemplate.render(Context({ 'discussion': self,'replies': [reply.html() for reply in self.replies.all()] })) 然后在您的顶级模板中,您只需要: <ul> {% for d in discussions %} {{ d.html }} {% endfor %} </ul> 根据需要应用CSS,使其看起来不错. 编辑:根讨论是Discussion.objects.filter(reply_to = None)中的讨论.所有代码,包括_DiscussionTemplate,都在你的models.py中.这样,_DiscussionTemplate在模块加载时初始化一次. 编辑2:将HTML放在模板文件中非常简单.更改将_DiscussionTemplate设置为的视图代码: _DiscussionTemplate = loader.get_template("discussiontemplate.html") 然后创建discussiontemplate.html: <li>{{ discussion.message }}{% if replies %} <ul> {% for reply in replies %} {{ reply }} {% endfor %} </ul> {% endif %}</li> 根据需要设置模板文件的路径. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |