У меня есть пользовательская модель User, которая содержит только два обязательных поля: email и password.

У меня также есть пользовательский UserCreationForm, который запрашивает у пользователей их email и один password.

К сожалению, форма не подтверждает пароль, кроме min_length.

Как включить средства проверки пароля в settings.AUTH_PASSWORD_VALIDATORS? Объект представляет собой список distc, а не Validators, поэтому я не уверен, как их использовать.

class UserCreationForm(forms.ModelForm):
    password1 = forms.CharField(
        widget=forms.PasswordInput(attrs=form_attrs.password),
        min_length=8,
        strip=True,
    )

    class Meta:
        model = User
        fields = ('email',)
        widgets = {
            'email': forms.EmailInput(attrs=form_attrs.email),
        }

    def save(self, commit=True):
        user = super().save(commit=False)
        user.set_password(self.cleaned_data.get('password1'))
        if commit:
            user.save()
        return user
3
JayFresco 14 Сен 2018 в 00:38

2 ответа

Лучший ответ

Как уже упоминал другой автор, Django использует метод django.contrib.auth.password_validation.validate_password для проверки пароля. Вы можете создать метод clean_password1 и добавить его к нему, вот так:

class UserCreationForm(forms.ModelForm):
    password1 = forms.CharField(
        widget=forms.PasswordInput(attrs=form_attrs.password),
        min_length=8,
        strip=True,
    )

    class Meta:
        model = User
        fields = ('email',)
        widgets = {
            'email': forms.EmailInput(attrs=form_attrs.email),
        }

    def clean_password1(self):
        password1 = self.cleaned_data.get('password1')
        try:
            password_validation.validate_password(password1, self.instance)
        except forms.ValidationError as error:

            # Method inherited from BaseForm
            self.add_error('password1', error)
        return password1
3
touch my body 14 Сен 2018 в 17:50

То, как django относится к встроенным формам:

def get_password_validators(validator_config):
    validators = []
    for validator in validator_config:
        try:
            klass = import_string(validator['NAME'])
        except ImportError:
            msg = "The module in NAME could not be imported: %s. Check your AUTH_PASSWORD_VALIDATORS setting."
            raise ImproperlyConfigured(msg % validator['NAME'])
        validators.append(klass(**validator.get('OPTIONS', {})))

    return validators

Это и после этого проверка выполняется внутри формы вручную.

Это означает, что вы можете импортировать password_validation из django.contrib.auth и использовать

@functools.lru_cache(maxsize=None)
def get_default_password_validators():
    return get_password_validators(settings.AUTH_PASSWORD_VALIDATORS)

Эта функция, чтобы получить валидаторы и внутри вашей формы

class UserCreationForm(forms.ModelForm):
    password1 = forms.CharField(
        widget=forms.PasswordInput(attrs=form_attrs.password),
        min_length=8,
        strip=True,
    )
    def clean_password1(self):
        # Validate user password
        # self.cleaned_data['password1'] has the password put into the field
        # if the validation fails
        # raise forms.ValidationError with the args and kwargs of your 
        # validators' error messages.

Вы можете посмотреть, как встроенная форма регистрации делает это.

1
Işık Kaplan 14 Сен 2018 в 03:17