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

Django首页视图获取用户点赞帖子报User匹配不存在错误如何解决

问题排查与修复方案

错误根因

  1. 首页视图未做登录状态校验,未登录用户访问时request.user是匿名用户对象,没有有效用户ID,所以查询User表时会抛出匹配不到的异常。
  2. 你不需要额外通过User.objects.get()查询用户,request.user本身就是已登录用户的User模型对象,重复查询属于多余操作。
  3. 原有逻辑里的is_favorite是全局变量,只能判断用户是否点赞过任意帖子,无法对应每个帖子的单独点赞状态,不符合单帖显示点赞图标的需求。
  4. 点赞切换接口返回值逻辑错误,会导致前端图标状态和实际状态相反。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 02:57:00