【问题标题】:How do I fix this django error:'User' object has no attribute 'backend'如何修复这个 django 错误:'User' 对象没有属性'backend'
【发布时间】:2017-06-26 12:45:07
【问题描述】:

还有其他几个类似的问题有答案,但没有一个能解决我的问题。每次我尝试通过在 Django 中注册来创建新用户时,我都会收到“您配置了多个身份验证后端,因此必须提供 backend 参数或在用户上设置 backend 属性”。这是我的看法:

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',

【问题讨论】:

标签: python django authentication


【解决方案1】:

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

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

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')
            form.save()
            user = authenticate(username=username, password=raw_password)
            if user is not None:
                login(request, user)
                return redirect('home')
    else:
        form = SignUpForm()

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

这里的视图是用来创建新用户的。因此,您可能需要在调用authenticate() 函数之前调用form.save() 方法。在提交到数据库之前,您正在尝试验证尚未创建的用户。检查您的视图是否确实登录了任何用户。然后,authenticate() 函数返回 None,如果凭据中有任何不匹配,那么也要检查一下。否则,Django 会在调用login() 函数时引发AttributeError

我严重怀疑您的视图是否会登录任何用户,因为无论登录是否成功,您都会重定向到同一页面。它非常违反直觉,使其更难调试。登录成功时直接跳转到首页,如果不成功则跳转到登录页面。

【讨论】:

    【解决方案2】:

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

    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})
    

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

    【讨论】:

      猜你喜欢
      • 2011-08-27
      • 2016-10-01
      • 2015-06-11
      • 1970-01-01
      • 2012-03-06
      • 2012-11-05
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多