Django пользовательская модель пользователя нужен пароль2 для формы входа в систему
у меня есть модель пользователя custome и форма для входа в систему, но в form.is_valid() у меня ошибка:
моя модель пользователя:
class MyAccountManager(BaseUserManager):
def create_user(self, email,username,password=None):
if not email:
raise ValueError('لطفا ایمیل را وارد کنید')
user = self.model(
email=self.normalize_email(email),
username=username,
)
user.set_password(password)
user.save()
user.save(using=self._db)
return user
def create_superuser(self, email,username, password):
user = self.create_user(
email=self.normalize_email(email),
username=username,
password=password,
)
user.is_admin= True
user.is_active=True
user.is_staff=True
user.is_superuser=True
user.save()
user.save(using=self._db)
return user
class User(AbstractBaseUser,PermissionsMixin):
username = models.CharField(max_length=100 , null=True)
mobile = models.CharField(max_length=100, null=False, verbose_name="موبایل")
email = models.CharField(max_length=180, verbose_name='ایمیل', unique=True, default=None, blank=True, null=True)
type = models.ForeignKey("userType.mUsertype", on_delete=models.CASCADE, verbose_name="نوع کاربری", null=True)
addressmain = models.TextField(verbose_name="آدرس")
website = models.CharField(max_length=100 , null=True)
logo_url = models.CharField(max_length=100 , null=True)
facebook_id = models.CharField(max_length=100 , null=True)
instagram_id = models.CharField(max_length=100, null=True)
telegram_id = models.CharField(max_length=100 , null=True)
whatsapp_id = models.CharField(max_length=100, null=True, verbose_name="واتس آپ")
twitter_id = models.CharField(max_length=100 , null=True)
description = models.TextField(verbose_name="توضیحات")
plan_expiry_date = models.DateTimeField(null=True)
plan_count = models.IntegerField(default=0)
country = models.CharField(max_length=100 , null=True)
city = models.CharField(max_length=100 , null=True)
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
objects = MyAccountManager()
def tokens(self):
return 'token'
def __str__(self):
return self.username.__str__()
моя форма:
class SigninForm(UserCreationForm):
def __init__(self, *args, **kwargs):
super(SigninForm, self).__init__(*args, **kwargs)
class Meta:
model = User
widgets={
'email': forms.TextInput(attrs={'placeholder': 'ایمیل'}),
'password1': forms.PasswordInput(attrs={'placeholder': 'پسورد'}),
}
fields = ("email","password1")
class SignupForm(UserCreationForm):
def __init__(self, *args, **kwargs):
super(SignupForm, self).__init__(*args, **kwargs)
self.fields['password1'].widget = forms.PasswordInput(
attrs={'class': 'form-control', 'placeholder': 'پسورد'})
self.fields['password2'].widget = forms.PasswordInput(
attrs={'class': 'form-control', 'placeholder': 'تکرار پسورد'})
class Meta:
model = User
widgets={
'username': forms.TextInput(attrs={'placeholder': 'نام'}),
'email': forms.TextInput(attrs={'placeholder': 'ایمیل'}),
# 'password1': forms.PasswordInput(attrs={'placeholder': 'پسورد'}),
# 'password2': forms.PasswordInput(attrs={'placeholder': 'تکرار پسورد'}),
}
fields = ("username","email","password1","password2","type")
моя форма в html и это для формы входа:
<form method="post">
{% csrf_token %}
{{ formsignin.email| add_class:"form-control" }}
{% if formsignin.email.errors %}
<div class="errors">
{% for error in formlogin.username.errors%}
<p>{{ error }}</p>
{% endfor %}
</div>
{% endif %}
{{ formsignin.password1| add_class:"form-control" }}
{% if formsignin.password1.errors %}
<div class="errors">
{% for error in formlogin.password.errors%}
<p>{{ error }}</p>
{% endfor %}
</div>
{% endif %}
<button class="btn btn-info" name='submit' type="submit" value='sign_in'>ورود</button>
</form>
и мое мнение:
def signin(request):
if request.method == 'POST':
print(request.POST)
if request.POST.get('submit') == 'sign_in':
form = SigninForm(request.POST)
print(form.errors)
if form.is_valid:
email = form.cleaned_data.get('email')
password = form.cleaned_data.get('password')
user = authenticate(email=email, password=password)
if user is not None:
login(request,user)
return redirect('home')
else:
messages.info(request,"نام کاربری یا رمز عبور اشتباه است")
else:
messages.info(request, "form is not true")
elif request.POST.get('submit') == 'sign_up':
print(request.POST)
username = request.POST['username']
email = request.POST['email']
type = request.POST['type']
password1 = request.POST['password1']
password2 = request.POST['password2']
myuser = User.objects.create_user(email,username,password1)
myuser.save()
messages.info(request, "ثبت نام شما با موفقیت ثبت شد")
formsignin = SigninForm()
formsignup = SignupForm()
return render(request, "login.html", {'formsignin':formsignin,'formsignup':formsignup})
если я убираю if form.is_valide() у меня ошибка для clean_data но пользователь сохраняет и все работает в чем проблема!?
Вы можете удалить поле встроенным методом del
class SigninForm(UserCreationForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
del self.fields['password2']