在 Django 中解决身份验证中的用户类型

Resolve user type in authentication in Django

我有一个简单的应用程序,它有两个模型,客户端和教师,它们通过 OneToOne 与默认的 Django 用户连接。

应用程序中只有一个登录页面。根据用户类型,我想将它们重定向到 /myaccount 但显示不同的模板。

这是我的代码:

def user_login(request):
context_dict ={}

if request.method =='POST':
    username = request.POST['username']
    password = request.POST['password']

    user= authenticate(username=username, password=password)

    #teacher flow
    if user.teacher:
        if user.is_active:
            login(request, user)
            template = 'teacher_account.html'
            context_dict['teacher'] = user
            return render(request, template, context_dict)
        else:
            return HttpResponse("Your account is disabled")
    #client flow
    elif user.client:
        if user.is_active:
            login(request, user)
            template = "client_account.html"
            context_dict['client'] = user
            return render(request, template, context_dict)
        else:
            return HttpResponse("Your account is disabled")

    else:
        print "Invalid login details: {0}, {1}".format(username, password)
        return HttpResponse("Invalid login details supplied")
#GET Request
else:
    return render(request, 'login.html', {})

如果是老师,它确实有效(某种程度上,重定向无效,但登录有效)。我试过调试,如果用户是客户端,由于某种原因,流程不会进入 else if,只是出错。在调试器中,我可以看到客户端对象存在,但出现错误 RelatedObjectDoesNotExist - User has no teacher。我做错了什么?

Django 1.7,Python2.7

user.client 存在,但 user.teacher 不存在,因此您收到错误,然后在 if user.teacher: 语句中访问此属性。

将其替换为如下内容:

if Teacher.objects.filter(user=user).exists():
    ...