Search code examples
djangodjango-authenticationdjango-users

User will not authenticate Django


I've asked this question a few times and have been working on this a few days and it still does not work. User will not authenticate in Django. I'm using the base user model. My user does not get authenticated and the form does not submit and I'm unclear what is going wrong.

Here is my views.py:

 def payments(request):
    if request.method == "POST":
        form = CustomUserCreationForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.is_active = False # this is because they need to fill out another form before I deem them active
            user.set_password(form.cleaned_data['password1'])
            user.save() 
            user = authenticate(request, username=form.cleaned_data['username'], password=form.cleaned_data['password1'])
            if user.is_authenticated:
                login(request, user, backend='django.contrib.auth.backends.ModelBackend')
                return redirect('agreements')
            else: 
                raise ValidationError("User could not be authenticated.")            
        else:
            raise ValidationError("Form is not valid. Try Again.")
    else:
        form = CustomUserCreationForm()
  return render(request, 'register.html', {'form': form})

Here is my forms.py:

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"}))
    first_name = forms.CharField(label='First Name', widget=forms.TextInput(attrs={'class': "form-control"}))
    last_name = forms.CharField(label='Last Name', widget=forms.TextInput(attrs={'class': "form-control"}))
    email = forms.CharField(label= 'Email', widget=forms.EmailInput(attrs={'class': "form-control"}))

    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'email', '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.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.email = self.cleaned_data['email']
        user.set_password(self.cleaned_data['password1'])

        if commit:
            user.save()
        return user

Solution

  • I think it is because of this user.is_active = False if this is set to True, only then any user authenticating and trying to login to Django will be allowed, check this in the docs is_active , they do have another option in case you don't want this default behaviour it says

    You can use AllowAllUsersModelBackend or AllowAllUsersRemoteUserBackend if you want to allow inactive users to login