如何在Django博客中添加嵌套评论

时间:2020-02-13 18:00:57

标签: python django

我有一个博客应用程序,其中有一个评论部分。只能由经过身份验证的用户发表评论。我想添加以嵌套格式向评论添加回复的功能,但是我不知道如何。

以下是评论部分涉及的模型:

class Article(models.Model):
    title = models.CharField(max_length=100)
    description = models.TextField()
    publish_date = models.DateField(auto_now_add=True)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    tag = models.ManyToManyField(Tag)
    thumbnail = models.ImageField(blank=True)
    content = HTMLField()

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-page', kwargs={'id': self.id})

    @property
    def get_comments(self):
        return self.comment_content.all()



class Comment(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    timestamp = models.DateTimeField(auto_now_add=True)
    article = models.ForeignKey(Article, related_name='comment_content', on_delete=models.CASCADE)
    content = models.TextField()

    def __str__(self):
        return self.user.username

我创建的模型形式:

class CommentForm(forms.ModelForm):
    content = forms.CharField(
        widget = forms.Textarea(
            attrs= {
                'class': 'form-control',
                'id': 'message',
                'cols': '30',
                'rows': '10',
            }
        )
    )

每个评论的呈现方式:

{% for comment in article.get_comments %}
                <li class="comment">
                  <div class="comment-body">
                    <h3>{{ comment.user.username }}</h3>
                    <div class="meta mb-3">{{ comment.timestamp }}</div>
                    <p>{{ comment.content }}</p>
                    <p><a href="#" class="reply">Reply</a></p>
                  </div>
                </li>
{% endfor %}

我已使用@property显示评论。我是否需要更改呈现评论的整体方式?有人可以帮助我创建回复吗? (顺便说一下,“回复”按钮没有任何作用。它与我正在使用的模板一起提供)

1 个答案:

答案 0 :(得分:1)

由于您希望能够向评论添加多个回复,因此需要创建另一个模型,称为“回复”,该模型与Comment模型具有多对一关系。这样,每个文章可以有多个评论,每个评论可以有多个回复。您的“回复”模型将如下所示:

class Reply(models.Model):
    comment = models.ForeignKey(Comment, related_name='replies',  on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    timestamp = models.DateTimeField(auto_now_add=True)
    reply = models.TextField()

    def __str__(self):
        return self.user.username

    @property
    def get_replies(self):
        return self.replies.all()

您可以使用与评论相同的方式呈现链接到评论的所有回复。

{% for comment in article.get_comments %}
    <li class="comment">
    <div class="comment-body">
        <h3>{{ comment.user.username }}</h3>
        <div class="meta mb-3">{{ comment.timestamp }}</div>
        <p>{{ comment.content }}</p>

            {% for reply in comment.get_replies %}
                <li class="reply">
                <div class="reply-body">
                    <h3>{{ reply.user.username }}</h3>
                    <div class="meta mb-3">{{ reply.timestamp }}</div>
                    <p>{{ reply.reply }}</p>
                    #ToDo Create a view to add replies and hook the url to href below
                    <p><a href="#" class="reply">Reply</a></p>
                </div>
                </li>
            {% endfor %}
    </div>
    </li>
{% endfor %}
相关问题