显示每个帖子的喜欢计数器与Django不工作



我想在views.py文件上获得一个变量,该变量检索每个帖子的喜欢列表。因此,然后在HTML文件中,我将使用.count,这样我就可以获得列表上的项目数量,并最终显示在DOM上。

我第一次在models.py上上课。在那里,我有3个类:User,文章,和Like。用户来自Django默认的User类。文章是一个获取文章信息的类,如作者、描述和时间戳。在Like类,获取用户并发布。

from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
pass
class Post(models.Model):
author = models.ForeignKey("User", on_delete=models.CASCADE, related_name="user")
description = models.CharField(max_length=1000)
timestamp = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.id}: {self.author}"
class Like (models.Model):
user = models.ForeignKey("User", on_delete=models.CASCADE, default='', related_name="user_like")
post = models.ForeignKey("Post", on_delete=models.CASCADE, default='', related_name="post_like")
def __str__(self):
return f"{self.id}:{self.user} likes {self.post}"
第二,我在views.py上创建了一个函数,叫做">index"。在那里,我得到了帖子的整个列表(在posts变量上),然后我尝试创建变量(totalLikesSinglePost),它应该得到每个帖子的喜欢列表。
def index(request):
posts = Post.objects.all().order_by("id").reverse()
# Pagination Feature (OMIT THIS, IF YOU WANT)
p = Paginator(posts, 10)
pageNumber = request.GET.get('page')
postsPage = p.get_page(pageNumber)
# Total likes of each post. DOESN'T WORK ⏬
for postSingle in posts: 
totalLikesSinglePost = Like.objects.all().filter(post = postSingle)
return render(request, "network/index.html", {
"posts": posts,
"postsPage": postsPage,
"totalLikesPost": totalLikesSinglePost
})

最后,在HTML文件中,我得到每个帖子及其信息和喜欢的数量。但是,输出只显示数字0

{% for post in postsPage %}
<div class="row">
<div class="col">
<div class="card h-100" id="post-grid">
<div class="card-body">
<h5>{{ post.author }}</h5>
<div> | {{ post.timestamp }}</div>
<p>{{ post.description }}</p>
<div class="card-buttonsContainer">
<strong style="color: red">{{ totalLikesPost.count }}</strong> <!--0 IS DISPLAYED-->
</div>
</div>
</div>
</div>
</div>
{% endfor %}    

当然,在那之后,我创建了一个超级用户,然后去admin添加一些示例到数据库中。但是,我在上添加了一些新行,例如表,但不显示每个帖子的点赞总数。

您的totalLikesSinglePost只是上一篇文章的Like记录列表。在你的html文件上试试:

<strong style="color: red">{{ post.post_like.count }}</strong>

因为totalLikesSinglePost在每一轮for循环中被覆盖。它是上一篇文章的点赞总数。

您需要将此数字作为属性分配给该帖子,例如

for post in posts:
post.num_likes = Like.objects.all().filter(post=post).count()

然后在模板中

{% for post in posts %}
{# ... #}
{{ post.num_likes }}
{% endfor %}

但是我强烈推荐你使用.annotate

from django.db.models import Count
posts = Post.objects.all().order_by('-id')
.annotate(num_likes=Count('like'))

这将只访问数据库一次,节省你很多时间。

最新更新