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

Django自动补全搜索对未登录用户抛出错误的修复方案

修复方案

问题根源

未登录状态下,request.user是AnonymousUser对象,而非你的自定义User实例——它没有rank属性,直接把它塞到game_rank__lte的查询条件里,数据库自然会报错:因为它要的是数字,你给的是个用户对象。

代码修复示例

普通视图中的查询逻辑

假设你原本的自动补全查询是这么写的:

# 错误写法:未登录时会触发TypeError
games = Game.objects.filter(game_rank__lte=request.user.rank)

改成下面这样,先判断用户是否登录:

def game_autocomplete(request):
    if request.user.is_authenticated:
        # 登录用户:只展示rank≤自身等级的已解锁游戏
        queryset = Game.objects.filter(game_rank__lte=request.user.rank)
    else:
        # 未登录用户:展示全部游戏
        queryset = Game.objects.all()
    
    # 提取补全需要的字段(比如id和名称)
    results = queryset.values('id', 'name')
    return JsonResponse(list(results), safe=False)

第三方自动补全库(比如django-autocomplete-light)的情况

如果用的是这类库的自定义查询集视图:

from dal import autocomplete

class GameAutocompleteView(autocomplete.Select2QuerySetView):
    def get_queryset(self):
        # 先处理未登录用户的情况
        if not self.request.user.is_authenticated:
            return Game.objects.all()
        
        # 登录用户返回已解锁游戏
        return Game.objects.filter(game_rank__lte=self.request.user.rank)

额外提醒

  • 确认你的User模型确实有rank字段,且是整数/数值类型
  • 永远不要在未验证用户是否登录的前提下,直接访问request.user的自定义属性——这是Django开发里的常见坑

内容的提问来源于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 09:35:05