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>
根据需要设置模板文件的路径. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
