Пользовательская форма регистрации в django работает некорректно
Форма заполняется успешно, даже если введен короткий числовой пароль. Я хочу, чтобы форма не могла задавать короткие пароли, состоящие только из цифр.
#forms.py
class RegisterUserForm(forms.ModelForm):
email = forms.EmailField(required=True, label='Адрес электронной почты')
password1 = forms.CharField(label='Пароль',
widget=forms.PasswordInput,
help_text=password_validation.password_validators_help_text_html())
password2 = forms.CharField(label='Пароль повторно',
widget=forms.PasswordInput,
help_text='Введите тот же самый пароль ещё раз для проверки')
captcha = CaptchaField(label='Введите текст с картинки ', error_messages={'invalid': 'Неправильный текст'}, generator='captcha.helpers.math_challenge')
def clean_password(self):
password1 = self.cleaned_data['password1']
if password1:
password_validation.validate_password(password1)
return password1
def clean(self):
super().clean()
password1 = self.cleaned_data['password1']
password2 = self.cleaned_data['password2']
if password1 and password2 and password1 != password2:
errors = {'password2': ValidationError(
'Введённые пароли не совпадают', code='password_mismatch')}
raise ValidationError(errors)
def save(self, commit=True):
user = super().save(commit=False)
user.set_password(self.cleaned_data['password1'])
if commit:
user.save()
return user
class Meta:
model = AdvUser
fields = ('username', 'email', 'password1', 'password2', 'first_name', 'last_name', 'photo', 'description', 'captcha')
Как я могу решить эту проблему?
Существует несколько валидаций паролей, которые предоставил django. Вы можете использовать их, добавив их в settings.py
:
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {
'min_length': 9,
}
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
При этом пароль должен иметь длину не менее 9, и не может быть только числовым
Подробнее об этом вы можете прочитать в https://docs.djangoproject.com/en/3.2/topics/auth/passwords/#enabling-password-validation
Кроме того, если этого недостаточно, вы можете сделать свою собственную проверку пароля. Читайте об этом в https://docs.djangoproject.com/en/3.2/topics/auth/passwords/#writing-your-own-validator
Вы можете добавить дополнительное условие в свою функцию clean_password1(self)
для достижения этого-
from django.core.exceptions import ValidationError
class RegisterUserForm(forms.ModelForm):
--------------------------------------------
def clean_password1(self):
password=self.cleaned_data['password1']
if len(password1)==0:
raise ValidationError("Please enter a password")
if len(password1)<8:
raise ValidationError("password is too short!")
if password1.isdigit():
raise ValidationError('Your password should contain letters!')
return password1
Я изменил свою форму на эту и все стало работать правильно:
#forms.py
from django.contrib.auth.forms import UserCreationForm
class RegisterUserForm(UserCreationForm):
email = forms.EmailField(required=True, label='Адрес электронной почты')
class Meta:
model = AdvUser
fields = ('username', 'email', 'password1', 'password2', 'first_name', 'last_name', 'photo', 'description')