Django页面点赞数始终显示0的原因及修复方案
Django首页帖子点赞数始终显示0的问题排查与修复
问题根源
你同时实现了两套独立的点赞逻辑,导致数据完全不互通:
- Post模型里定义了
likes多对多字段,模板中用{{ post.likes.count }}获取计数 - 又单独创建了Like模型,视图的
like_post函数操作的是这个独立模型的表
两者没有任何关联,模板读取的是Post多对多字段的空数据(始终为0),而实际点赞数据存在Like表中,刷新页面后又回到初始的空计数。
修复方案(二选一即可)
方案一:简化逻辑,使用Post的多对多字段(推荐)
直接删除多余的Like模型,统一用Post自带的多对多关联实现点赞:
- 修改models.py:删除Like类,保留Post的likes字段
from django.contrib.auth.models import AbstractUser from django.db import models from datetime import datetime from django.contrib.auth import get_user_model class CustomUser(AbstractUser): profile_picture = models.ImageField( upload_to="profile_pics/", blank=True, null=True ) def __str__(self): return self.username class Post(models.Model): user = models.ForeignKey(CustomUser, on_delete=models.CASCADE) title = models.CharField(max_length=1000) content = models.TextField() created_at = models.DateTimeField(default=datetime.now, null=True, blank=True) likes = models.ManyToManyField( get_user_model(), related_name="liked_posts", blank=True )
- 修改views.py的like_post函数:操作Post的likes关联,而非独立的Like模型
def like_post(request): if request.method == "POST": post_id = request.POST.get("post_id") post = get_object_or_404(Post, id=post_id) user = request.user # 检查用户是否已点赞 if user in post.likes.all(): return JsonResponse( {"error": "你已经点过赞了"}, status=400 ) # 添加点赞 post.likes.add(user) updated_likes_count = post.likes.count() return JsonResponse({"likes": updated_likes_count}) else: return JsonResponse({"error": "无效请求"}, status=400)
- 模板无需修改:
{{ post.likes.count }}可以正常读取多对多关联的计数
方案二:保留独立Like模型,删除Post的多对多字段
如果需要保留Like模型(比如后续要扩展点赞的额外属性),则统一用Like模型统计:
- 修改models.py:删除Post中的likes多对多字段
class Post(models.Model): user = models.ForeignKey(CustomUser, on_delete=models.CASCADE) title = models.CharField(max_length=1000) content = models.TextField() created_at = models.DateTimeField(default=datetime.now, null=True, blank=True) # 移除这行:likes = models.ManyToManyField(...)
- 修改views.py的index函数:用annotate预加载点赞计数,避免N+1查询
from django.db.models import Count def index(request): # 给每个帖子标注点赞数 posts = Post.objects.annotate(likes_count=Count('like')) return render(request, "index.html", {"posts": posts})
- 修改index.html模板:替换点赞数的读取字段
<span id="likeCount{{ post.id }}">{{ post.likes_count }}</span> Likes
- like_post函数无需修改:原本的逻辑就是操作Like模型,返回的计数是正确的
内容的提问来源于stack exchange,提问作者GDFMK
相关产品推荐
相关产品推荐

