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
相关产品推荐
相关产品推荐

