Django首页视图获取用户点赞帖子报User匹配不存在错误如何解决
问题排查与修复方案
错误根因
- 首页视图未做登录状态校验,未登录用户访问时
request.user是匿名用户对象,没有有效用户ID,所以查询User表时会抛出匹配不到的异常。 - 你不需要额外通过
User.objects.get()查询用户,request.user本身就是已登录用户的User模型对象,重复查询属于多余操作。 - 原有逻辑里的
is_favorite是全局变量,只能判断用户是否点赞过任意帖子,无法对应每个帖子的单独点赞状态,不符合单帖显示点赞图标的需求。 - 点赞切换接口返回值逻辑错误,会导致前端图标状态和实际状态相反。
1. 修复views.py代码
home_view 修复版本
def home_view(request): # 查询所有有效帖子 posts = Post.objects.filter(date_posted__lte=timezone.now(), is_active=True).order_by('-date_posted') liked_post_ids = set() # 仅登录用户才查询点赞列表 if request.user.is_authenticated: # 直接通过当前用户关联的liked字段获取所有点赞帖子ID,存为集合方便模板快速判断 liked_post_ids = set(request.user.liked.values_list('id', flat=True)) context = { 'posts': posts, 'liked_post_ids': liked_post_ids, } return render(request, 'blog/home.html', context)
PostLikeToggle 修复版本
@login_required def PostLikeToggle(request): # 限制仅接受POST请求 if request.method != 'POST': return JsonResponse({'error': '非法请求'}, status=405) post_id = request.POST['post_id'] post = get_object_or_404(Post, id=post_id) user_liked = request.user in post.liked.all() if user_liked: post.liked.remove(request.user) else: post.liked.add(request.user) # 返回操作后的最新点赞状态 return JsonResponse({'liked': not user_liked})
2. 修复home.html模板逻辑
单帖图标渲染逻辑
循环渲染帖子时,直接判断当前帖子ID是否在用户点赞ID集合里,对应显示填充/未填充图标:
{% for post in posts %} <!-- 其他帖子展示代码 --> <button data-item-id="{{ post.id }}" class="addToFavsContainer" value="{{ post.id }}"> <i class="thumb-{{ post.id }} {% if post.id in liked_post_ids %}fas{% else %}far{% endif %} fa-thumbs-up"></i> </button> {% endfor %}
通用点赞JS逻辑
不需要为每个帖子单独生成一段JS,全局绑定一次即可,减少冗余代码:
<script> $(".addToFavsContainer").click(function () { const item_id = $(this).data('item-id'); const $thumb = $(`.thumb-${item_id}`); $.ajax({ type: "POST", url: "{% url 'like' %}", data: { post_id: item_id, csrfmiddlewaretoken: $("input[name=csrfmiddlewaretoken]").val(), }, dataType: "json", success: function (data) { if (data.liked) { $thumb.removeClass("far").addClass("fas"); } else { $thumb.removeClass("fas").addClass("far"); } }, error: function () { alert('操作失败,请刷新后重试'); } }); }); </script>
内容的提问来源于stack exchange,提问作者buchstabe
相关产品推荐
相关产品推荐

