我有一个博客应用程序,其中有一个评论部分。只能由经过身份验证的用户发表评论。我想添加以嵌套格式向评论添加回复的功能,但是我不知道如何。
以下是评论部分涉及的模型:
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显示评论。我是否需要更改呈现评论的整体方式?有人可以帮助我创建回复吗? (顺便说一下,“回复”按钮没有任何作用。它与我正在使用的模板一起提供)
答案 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 %}