Django注册后无法登录用户

时间:2019-09-02 05:54:47

标签: django authentication django-users

该应用具有基本的注册表格。在用户填写之后,我正在尝试对其进行身份验证。但是,我无法对其进行身份验证。我会以正确的方式解决这个问题吗?

这是视图:

def registration(request):
    if request.method == "POST":
         form = CustomUserCreationForm(request.POST)
         if form.is_valid():
             user = request.user
             password1 = form.cleaned_data['password1']
             #this works
             try:
                 validate_password(password1, user)
             except ValidationError as e:
                   form.add_error('password1', e)  
                   return render(request, 'register.html', {'form': form}) 
             profile = form.save(commit=False)
             profile.save() 
             user = authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password1'])
             # this login not working, user is never authenticated
             login(request, user)
             return redirect('agree')             
        else:
             raise ValidationError("Form is not valid. Try Again.")
    else:
        form = CustomUserCreationForm()
    return render(request, 'register.html', {'form': form}).   

这是forms.py。这里的模型只是Django基本用户模型。

class CustomUserCreationForm(forms.ModelForm):
    username = forms.CharField(label='Username', widget=forms.TextInput(attrs={'class': "form-control"}))
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput(attrs={'class': "form-control"}))
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput(attrs={'class': "form-control"}))

    class Meta:
        model = User
        fields =  ['username']

    def clean_password(self):
        password1 = self.cleaned_data.get('password1')
        password2 = self.cleaned_data.get('password2')
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("Passwords do not match")
        return password2


    def save(self, commit=True):
        user = super(CustomUserCreationForm, self).save(commit=False)
        user.username = self.cleaned_data['username']
        user.set_password(self.cleaned_data['password1'])

        if commit:
            user.save()
        return user

用户永远不会得到注册和认证。

1 个答案:

答案 0 :(得分:1)

对于authenticate()方法,您需要传递request(django后端中的引用authenticate()方法)。例如:

authenticate(request, username=form.cleaned_data['username'], password=form.cleaned_data['password1'])

还有一个原因,因为您已经拥有用户对象,所以为什么需要authenticate方法:

profile = form.save()  # <-- Its an user instance, name of the variable should be user
login(request, profile, backend='django.contrib.auth.backends.ModelBackend')
return redirect('agree')

最后,您的实现看起来有些混乱,为什么要使用user=request.user,用户是否已经登录?我认为这部分代码是不必要的:

user = request.user
password1 = form.cleaned_data['password1']
try:
    validate_password(password1, user)
except ValidationError as e:
    form.add_error('password1', e)  
    return render(request, 'register.html', {'form': form})