Пользовательская форма регистрации в 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')
Вернуться на верх