加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 11:13:54 所属栏目:Python 来源:网络整理
导读:我有一个应用程序,基本上是一个会话系统(很像reddit). 如果帖子可以有多个回复,回复并且有多个回复,并且对回复的回复可以有多个回复(等等) 我做了这样的模型: class Discussion(models.Model): message = models.TextField() replies = models.ManyToManyFi
我有一个应用程序,基本上是一个会话系统(很像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>

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读