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

Django Ajax点赞功能刷新页面后消失,求问题原因排查

Django Ajax点赞刷新后状态消失的问题排查与解决

1. Ajax请求的文章ID传递错误

你的detail.html中,Ajax请求的body使用了{{ post.pk }},但在Django通用视图(如DetailView、DeleteView)的模板上下文里,文章对象默认以object为名,而非post。这会导致post_pk的值为空,后端无法获取正确的文章ID,点赞操作根本没作用到目标文章上。

修复代码:
修改Ajax请求的body部分:

body: `post_pk={{ object.pk }}`,

2. 详情页视图未传递点赞状态上下文

你仅在DeletePost视图中处理了is_user_liked和like_count的上下文数据,但你的detail.html对应的是文章详情页,应该使用DetailView而非DeleteView。如果你的详情页视图没有重写get_context_data方法来传递这两个变量,刷新页面时模板无法判断用户是否已点赞,会默认显示未点赞状态。

修复代码:
创建或修改文章详情视图:

from django.views.generic import DetailView
from django.contrib.auth.mixins import LoginRequiredMixin

class PostDetailView(LoginRequiredMixin, DetailView):
    model = Post
    template_name = 'detail.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # 传递点赞数
        context['like_count'] = self.object.like_set.count()
        # 传递当前用户的点赞状态
        context['is_user_liked'] = self.object.like_set.filter(user_id=self.request.user).exists()
        return context

额外优化点

  • 规范外键字段名:Like模型中的user_id建议改为user,符合Django外键命名惯例,后续代码更易读:
    class Like(models.Model):
        user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
        target = models.ForeignKey(Post, on_delete=models.CASCADE)
    
    对应的视图代码也要同步修改:
    like = Like.objects.filter(target=article, user=request.user)
    # ...
    like.create(target=article, user=request.user)
    
  • 添加唯一约束:给Like模型添加联合唯一约束,防止同一用户重复点赞同一文章:
    class Like(models.Model):
        user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
        target = models.ForeignKey(Post, on_delete=models.CASCADE)
    
        class Meta:
            unique_together = ('user', 'target')
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 12:10:56