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

My error message



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 in snake_case not in smallcase, it will be better if you changed it to user_sign_up from usersignup.

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