'I am getting an error message that password does not match in django forms
I am creating a "UsercreationForm" in django. When I saved the form, it didn't create any entry in database then I debug it and found an error message that Password fields does not match I don't know what I did wrong. Please help me figure it out.
Here is my forms.py
from django import forms
from accounts.models import Customer, User
from django.contrib.auth.forms import UserCreationForm
from django.core.exceptions import ValidationError
from datetime import datetime
class UserSignup(UserCreationForm):
class Meta:
model = User
fields = ("username","first_name", "last_name", "email")
username = forms.CharField(label="Username", required=True)
first_name= forms.CharField(label="First Name", required=True)
last_name=forms.CharField(label="Last Name", required=False)
email =forms.EmailField(label="Email", required=False)
password1 = forms.CharField(label="Password", required=True)
password2 = forms.CharField(label="Confirm Password", required=True)
def username_clean(self):
username = self.cleaned_data['username'].lower()
new = User.objects.filter(username = username)
if new.count():
raise ValidationError("User Already Exist")
return username
def email_clean(self):
email = self.cleaned_data['email'].lower()
new = User.objects.filter(email=email)
if new.count():
raise ValidationError(" Email Already Exist")
return email
def clean_password2(self):
password1 = self.cleaned_data['password1']
password2 = self.cleaned_data['password2']
if password1 != password2:
raise ValidationError("Password don't match")
return password2
def save(self, commit = True):
user = User.objects.create_user(
self.cleaned_data['username'],
self.cleaned_data['email'],
self.cleaned_data['password1'],
last_login= datetime.now()
)
return user
class AddDetails(forms.ModelForm):
class Meta:
model = Customer
fields = ("age", "phone")
age = forms.IntegerField(label="Age", required=True)
phone = forms.CharField(label="Mobile Number", required=True)
Here is my views.py
from django.shortcuts import render, redirect
from accounts.forms import *
from datetime import datetime
from django.contrib import messages
def usersignup(request):
if request.method=="POST":
# User Sign-up form (username, email, first_name, last_name, password1, password2)
user_form= UserSignup()
# Customer detail form (age and phone number)
details_form = AddDetails(request.POST)
# If both forms are valid
if all((user_form.is_valid(), details_form.is_valid())):
# Saving with commit=False gets you a model object, then you can add your extra data and save it.
user = user_form.save()
customer= details_form.save(commit=False)
# As user is in OnetoOne Relationship with customer
customer.user= user
customer.save()
messages.success(request, 'Account created successfully')
# return redirect('details')
# if a GET (or any other method) we'll create a blank form
user_form =UserSignup()
details_form= AddDetails()
return render(request, 'registration_form.html', {'user_form': user_form, 'details_form': details_form})
Here is registration_form.html
{% extends 'base.html' %}
{% block content %}
<div class = "login">
{% if messages %}
<ul>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
<h1>Sign up for new account</h1>
<form method="post" >
{% csrf_token %}
<table>
{{user_form.as_table}}
{{details_form.as_table}}
<tr>
<td></td>
<td><input type="submit" name="submit" value="Register" /></td>
</tr>
</table>
</form>
</div>
{% endblock content %}
Here are my models
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
class Customer(models.Model):
user= models.OneToOneField(User, on_delete=models.CASCADE)
age= models.IntegerField(blank=True)
phone= models.CharField(max_length=15, blank=False, null=False)
def __str__(self):
return self.user.first_name
Both passwords are matched. but still getting errors.
Solution 1:[1]
I think, this is because of your if condition in the usersignup view, try some modifications in it, for checking both form validation try changing it to if user_form.is_valid() and details_form.is_valid():, in the following way:
views.py
def usersignup(request):
if request.method == "POST":
# User Sign-up form (username, email, first_name, last_name, password1, password2)
user_form = UserSignup(request.POST)
# Customer detail form (age and phone number)
details_form = AddDetails(request.POST)
# If both forms are valid
if user_form.is_valid() and details_form.is_valid():
# Saving with commit=False gets you a model object, then you can add your extra data and save it.
user = user_form.save()
customer = details_form.save(commit=False)
# As user is in OnetoOne Relationship with customer
customer.user = user
customer.save()
messages.success(request, 'Account created successfully')
# return redirect('details')
# if a GET (or any other method) we'll create a blank form
user_form = UserSignup()
details_form = AddDetails()
return render(request, 'home/registration_form.html', {'user_form': user_form, 'details_form': details_form})
Note:Function based views are generally written insnake_casenot insmallcase, it will be better if you changed it touser_sign_upfromusersignup.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |

