Django - 认证()返回无

Jas*_*der 1 python authentication django nonetype

我阅读了很多关于这个问题的话题,问题总是存在。当我提交登录表单时,身份验证函数()返回 None。我使用函数 set_password() 进行注册,它没有任何改变。

这是我的代码(也在这里):

from django.contrib.auth.models import User
from django.shortcuts import render
from forms import LoginForm, RegistrationForm
from django.contrib import auth

def login(request):
    state = 0 # 0 = initialisation / 1 = OK / 2 = BAD_PW
    form = LoginForm()
    if request.method == 'POST':
        error = False
        if request.method == "POST":
            form = LoginForm(request.POST)
            if form.is_valid():
                email = form.cleaned_data["email"]
                password = form.cleaned_data["password"]
                user = auth.authenticate(email=email,
                                    password=password)
                if user:
                    auth.login(request, user)
                    state = 1
                else:
                    state = 2
                    print "login state " + str(state)
        else:
            form = LoginForm()

    return render(request, "birneo/login.html", locals())

def register(request):
    state = 0
    form = RegistrationForm()
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            user = User()
            user.username = form.cleaned_data['username']
            user.email = form.cleaned_data['email']
            user.set_password(form.cleaned_data['password'])
            user.save()
            state = 1
            form = RegistrationForm()
        else:
            form = RegistrationForm()

    return render(request, "birneo/register.html", locals())
Run Code Online (Sandbox Code Playgroud)

raf*_*lmp 6

您的问题是您尝试根据电子邮件/密码对对用户进行身份验证,并且没有接受此类对的后端。模型后端接受用户名/密码对,因此使用电子邮件进行身份验证:

(...)
if form.is_valid():
    email = form.cleaned_data["email"]
    password = form.cleaned_data["password"]
    username = User.objects.get(email=email).username
    user = auth.authenticate(username=username, password=password)
    if user:
(...)
Run Code Online (Sandbox Code Playgroud)