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

Django登录用户搜索结果加载异常问题求助

问题分析与修复方案

问题根源

登录用户搜索时,代码在处理认证逻辑时完全覆盖了已完成搜索过滤的查询集:原本先根据搜索词过滤了user_profile_games_filter,但登录分支里直接用Game_Info.objects.annotate(...)重新赋值,导致之前的搜索过滤被丢弃,最终返回全部游戏。

修复后的views.py代码

def is_valid_queryparam(param):
    return param != '' and param is not None

def search_filter_view(request):
    user_profile_games_filter = Game_Info.objects.all()
    user_profile = User_Info.objects.all()
    title_query = request.POST.get('q')  

    if is_valid_queryparam(title_query):
        user_profile_games_filter = user_profile_games_filter.filter(game_title__icontains=title_query)

    if request.user.is_authenticated:
        user_profile = User_Info.objects.filter(user=request.user)
        user_profile_game_obj = User_Info.objects.get(user=request.user)
        user_profile_rank = int(user_profile_game_obj.rank)

        # 关键修改:基于已过滤的查询集添加注解,而非重新查询全部游戏
        user_profile_games_filter = user_profile_games_filter.annotate(
            user_unlocked_game=Case(
                When(game_rank__lte=user_profile_rank, then=Value(True)),
                default=Value(False),
                output_field=BooleanField()
            )
        )

        context = {
            'user_profile': user_profile,  
            'user_profile_games_filter': user_profile_games_filter,
            'title_query' : title_query
        }

    else:
        context = {
            'user_profile': user_profile,
            'user_profile_games_filter': user_profile_games_filter,
            'title_query' : title_query
       }

    return render(request, "search_results.html", context)

修改说明

  • 登录分支中,将Game_Info.objects.annotate(...)改为user_profile_games_filter.annotate(...),保留之前根据搜索词完成的过滤逻辑,同时添加用户解锁状态的注解。
  • 前端模板search.html无需修改,现有逻辑即可实现需求:登录用户搜索时仅展示名称包含查询词的已解锁/锁定游戏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:55:26