显示django中与同一帖子相关的每条帖子的评论数



朋友们好,我正在建一个博客,遇到了一个问题。我的问题是,当我想显示每条帖子的评论数量时,博客主页上的评论数量会显示所有有评论的帖子,但每条帖子的注释数量是相同的。如果帖子2有3条评论,而另一条有1条评论。

你可以在这张照片中看到。图像

这是后型号

class Post(models.Model):
STATUS_CHOICES = (
('draft', 'Draft'),
('published', 'Published'),
)
title = models.CharField(max_length=255, unique=True)
slug = models.SlugField(max_length=255, unique=True)
author = models.ForeignKey(User, on_delete=models.CASCADE)
body = models.TextField()
created_date = models.DateTimeField(auto_now_add=True)
status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')
image = models.ImageField(null=True, blank=True, upload_to="images/")
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('post_detail', args=[self.created_date.year,
self.created_date.strftime('%m'),
self.created_date.strftime('%d'),
self.slug])
def active_comment(self):
return self.comments.filter(active=True)

这是评论模型

class Comment(models.Model):
post = models.ForeignKey(Post, related_name="comments", on_delete=models.CASCADE)
name = models.CharField(max_length=100)
email = models.EmailField()
comment = models.CharField(max_length=500)
active = models.BooleanField(default=False)
created_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return "{} by {}".format(self.comment, self.name)

这是我的观点.py

def post_list(request):
posts = models.Post.objects.filter(status='published')
paginator = Paginator(posts, 4)
page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number)
comment_count = models.Comment.objects.filter(active=True).count()
context = {
'page_obj': page_obj,
'comment_count': comment_count,
}
# print(posts)
return render(request, "post_list.html", context=context)

这也是post_list.html

<article class="col-12 col-md-6 tm-post">
<hr class="tm-hr-primary">
<a href="{{ post.get_absolute_url }}"
class="effect-lily tm-post-link tm-pt-60">
<div class="tm-post-link-inner">
<img src="/{{ post.image }}/" alt="Image" class="img-fluid">
</div>
<h2 class="tm-pt-30 tm-color-primary tm-post-title">{{ post.title }}</h2>
</a>
<p class="tm-pt-30">
{{ post.body|slice:254 }}
</p>
<div class="d-flex justify-content-between tm-pt-45">
<span class="tm-color-primary">Travel . Events</span>
<span class="tm-color-primary">{{ post.created_date.year }}/{{ post.created_date.month }}/{{ post.created_date.day }}</span>
</div>
<hr>
<div class="d-flex justify-content-between">
<span>
{% for comment in post.active_comment|slice:"1" %}
{{ comment_count }}<span> Comment</span>
{% endfor %}
</span>
<span>{{ post.author|capfirst }}</span>
</div>
</article>

请引导我。

您可以.annotate(…)[Django doc]使用:

from django.db.models importCount, Q
# …
posts = Post.objects.annotate(number_of_comments=Count('comment', filter=Q(comment__active=True)))

由此QuerySet产生的Post对象将具有额外的属性.number_of_comments

基于@willempost,您也需要相应地编辑模板:

posts = Post.objects.annotate(number_of_comments=Count('comment', filter=Q(comment_set__active=True)))

并且在模板中

<div class="d-flex justify-content-between">
<span>{{post.number_of_comments}}</span>
<span>{{ post.author|capfirst }}</span>
</div>

您在注释模型中将related_name指定为"comments"。这就是Fielderror的来源将查询中的"comment_set"更改为"comments",让我们看看

最新更新