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

