如何修复此django错误:'用户'对象没有属性'后端'

时间:2017-06-25 18:40:55

标签: python django authentication

还有其他几个类似问题的答案,但没有一个能解决我的问题。我得到了“你配置了多个身份验证后端,因此必须提供backend参数或者在用户上设置backend属性'每次我尝试使用Django中的注册创建新用户。以下是我的观点:

def signupUser(request):

    if request.method == 'POST':
        form = SignUpForm(request.POST)

        if form.is_valid():
            form.save(commit=False)
            username = form.cleaned_data.get('username')
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=username, password=raw_password)
            form.save()
            user.backend = 'django.contrib.auth.backends.ModelBackend'
            login(request, user)
            return redirect('home')
    else:
        form = SignUpForm()

    return render(request, 'signup.html', {'form': form})

我已经添加user.backend = 'django.contrib.auth.backends.ModelBackend'以期解决问题,但它没有做任何事情。

我的forms.py:

class SignUpForm(UserCreationForm):
    email = forms.EmailField(max_length=254, help_text='Required. Inform a valid email address.')
    password1=forms.CharField(help_text='Your password cant be too similar to your other personal information. Your password must contain at least 8 characters. Your password cant be a commonly used password. Your password cant be entirely numeric.', widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

顺便说一句,在我的AUTHENTICATION_BACKENDS中有“django.contrib.auth.backends.ModelBackend'和' allauth.account.auth_backends.AuthenticationBackend',

2 个答案:

答案 0 :(得分:1)

您的视图功能中存在一些错误。我不知道这对你有什么影响,但为了清楚起见,我想指出一些。

首先,我正在以更合适的方式重写您的观点,

form.save()

此处,该视图旨在用于创建新用户。因此,您可能需要在调用authenticate()函数之前调用authenticate()方法。在提交到数据库之前,您正在尝试验证尚未创建的用户。检查您的视图是否确实记录了任何用户。然后,AttributeError函数返回None,如果凭据中存在任何不匹配,那么,检查一下。否则,当调用login()函数时,Django会引发{{1}}。

我严重怀疑您的视图是否记录在任何用户中,因为无论登录成功与否,您都会重定向到同一页面。它非常反直觉,使调试更加困难。只需在登录成功时重定向到主页,如果不是,则重定向到登录页面。

答案 1 :(得分:0)

我意识到即使出现此错误,仍然会创建用户,所以我想它可以完成工作。但是为了摆脱这个错误,我改变了我的看法:

def signupUser(request):

    if request.method == 'POST':
        form = SignUpForm(request.POST)

        if form.is_valid():
            form.save(commit=False)
            username = form.cleaned_data.get('username')
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=username, password=raw_password)
            form.save()

            try:
                login(request, user)
            except ValueError:
                return redirect('home')

            return redirect('home')
    else:
        form = SignUpForm()

    return render(request, 'signup.html', {'form': form})

奇怪的是(至少对我来说很奇怪)。用户已创建,可以正确登录。我不认为这有任何不良副作用,但我会等待标记我的解决方案,以防万一有更好的解决方案。