Отображение количества комментариев каждого поста, относящихся к одному и тому же посту в django
Здравствуйте друзья, я создаю блог и столкнулся с проблемой. Моя проблема заключается в том, что когда я хочу отобразить количество комментариев для каждого поста, на главной странице блога количество комментариев отображает все посты, которые имеют комментарии, но количество комментариев для каждого поста одинаковое. В случае, если пост 2 имеет 3 комментария, а другой имеет 1 комментарий.
Вы можете увидеть на этой фотографии. Изображение
Это мой models.py
class Comment(models.Model):
post = models.ForeignKey(Post, 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)
Это мой views.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 import Count, Q
# …
posts = Post.objects.annotate(number_of_comments=Count('comment_set', filter=Q(comment_set__active=True)))
Объекты Post
, возникающие в результате этого QuerySet
, будут иметь дополнительный атрибут .number_of_comments
.
Основываясь на сообщении @willem, вам нужно соответствующим образом отредактировать ваш шаблон:
posts = Post.objects.annotate(number_of_comments=Count('comment_set', 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" и посмотрим