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

