Я получаю сообщение об ошибке, что пароль не совпадает в формах 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
Оба пароля подобраны. но все еще получаем ошибки.
Я думаю, это из-за вашего условия 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.
