You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django页面点赞数始终显示0的原因及修复方案

Django首页帖子点赞数始终显示0的问题排查与修复

问题根源

你同时实现了两套独立的点赞逻辑,导致数据完全不互通:

  • Post模型里定义了likes多对多字段,模板中用{{ post.likes.count }}获取计数
  • 又单独创建了Like模型,视图的like_post函数操作的是这个独立模型的表
    两者没有任何关联,模板读取的是Post多对多字段的空数据(始终为0),而实际点赞数据存在Like表中,刷新页面后又回到初始的空计数。

修复方案(二选一即可)

方案一:简化逻辑,使用Post的多对多字段(推荐)

直接删除多余的Like模型,统一用Post自带的多对多关联实现点赞:

  1. 修改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
    )
  1. 修改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)
  1. 模板无需修改:{{ post.likes.count }}可以正常读取多对多关联的计数

方案二:保留独立Like模型,删除Post的多对多字段

如果需要保留Like模型(比如后续要扩展点赞的额外属性),则统一用Like模型统计:

  1. 修改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(...)
  1. 修改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})
  1. 修改index.html模板:替换点赞数的读取字段
<span id="likeCount{{ post.id }}">{{ post.likes_count }}</span> Likes
  1. like_post函数无需修改:原本的逻辑就是操作Like模型,返回的计数是正确的

内容的提问来源于stack exchange,提问作者GDFMK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:17:03