Я получаю сообщение об ошибке, что пароль не совпадает в формах django

Я создаю "UsercreationForm" в django. Когда я сохранил форму, она не создала никакой записи в базе данных, затем я отладил ее и обнаружил сообщение об ошибке, что Поля пароля не совпадают. Я не знаю, что я сделал неправильно. Пожалуйста, помогите разобраться.

Вот мой 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)

Вот мой 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})



Здесь находится 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 %}  

Вот мои модели

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
    

Оба пароля подобраны. но все еще получаем ошибки.

My error message

Я думаю, это из-за вашего условия if в представлении usersignup, попробуйте внести некоторые изменения в него, для проверки обеих форм валидации попробуйте изменить его на if user_form.is_valid() and details_form.is_valid():, следующим образом:

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: Представления на основе функций обычно пишутся в snake_case, а не в smallcase, будет лучше, если вы измените его на user_sign_up с usersignup.

Вернуться на верх