gpt4 book ai didi

django - django 中的多线程对话(如 Reddit)

转载 作者:行者123 更新时间:2023-12-02 09:55:11 25 4
gpt4 key购买 nike

我有一个应用程序,本质上是一个对话系统(很像 reddit)。

一个帖子可以有多个回复,一个回复可以有多个回复,一个回复的回复可以有多个回复(等等)

我制作了这样的模型:

class Discussion(models.Model):
message = models.TextField()
replies = models.ManyToManyField('self')

和 View :

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', related_name='replies',
null=True, 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 的 View 代码更改为:

_DiscussionTemplate = loader.get_template("discussiontemplate.html")

然后创建discussiontemplate.html:

<li>{{ discussion.message }}{% if replies %}
<ul>
{% for reply in replies %}
{{ reply }}
{% endfor %}
</ul>
{% endif %}</li>

根据需要设置模板文件的路径。

关于django - django 中的多线程对话(如 Reddit),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2929422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com