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