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

如何在Django中判断登录用户类型并返回对应模板?

解决方法

错误原因

你查询用户类型时的写法有误:Student和Supervisor模型的profile字段是直接关联User的OneToOneField,因此无需通过profile__user进行关联查询,直接匹配profile=user即可,原写法会触发关联查询不支持的错误。

修正后的视图实现

def homePage(request):
    if not request.user.is_authenticated:
        return render(request, 'accounts/login.html')
    
    user = request.user
    # 直接通过profile字段匹配当前用户
    is_student = Student.objects.filter(profile=user).exists()
    is_supervisor = Supervisor.objects.filter(profile=user).exists()
    
    # 根据用户类型返回对应模板
    if is_student:
        return render(request, 'students/home.html')  # 替换为你的学生模板路径
    elif is_supervisor:
        return render(request, 'supervisors/home.html')  # 替换为你的导师模板路径
    else:
        # 处理既非学生也非导师的用户场景,比如普通管理员
        return render(request, 'general/home.html')  # 替换为通用模板路径

额外优化方案

可以通过try-except直接获取模型实例,既判断用户类型又能将实例传递给模板,还能减少数据库查询次数:

def homePage(request):
    if not request.user.is_authenticated:
        return render(request, 'accounts/login.html')
    
    try:
        student = Student.objects.get(profile=request.user)
        return render(request, 'students/home.html', {'student': student})
    except Student.DoesNotExist:
        pass
    
    try:
        supervisor = Supervisor.objects.get(profile=request.user)
        return render(request, 'supervisors/home.html', {'supervisor': supervisor})
    except Supervisor.DoesNotExist:
        pass
    
    return render(request, 'general/home.html')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 23:12:41