Чистые формы композиции Django работают некорректно

class RegisterForm(forms.ModelForm):
    ...
    class Meta:
        model = CreateUser
        ...
    def clean(self, password1, password2, error_key="password"):
        symbols = ['$', '@', '#', '%', '!']
        password1 = self.cleaned_data.get('password')
        password2 = self.cleaned_data.get('password2')
        errors = dict()
        if password1 and password2:
            if password1 != password2:
                errors[error_key] = "Passwords do not match"
                raise forms.ValidationError(errors)
            if not any(symbol in symbols for symbol in password1):
                s = ", "
                errors[error_key] = f"Passwords don\'t have symbols like {s.join(symbols)}"
                raise forms.ValidationError(errors)
            if not any(char.isdigit() for char in password1):
                errors[error_key] = "Password should have at least one numeral"
                raise forms.ValidationError(errors)
            if not any(char.isupper() for char in password1):
                errors[error_key] = "Password should have at least one uppercase letter"
                raise forms.ValidationError(errors)
            if not any(char.islower() for char in password1):
                errors[error_key] = "Password should have at least one lowercase letter"
                raise forms.ValidationError(errors)
        return self.cleaned_data

class SetPasswordsForm(forms.Form):
    ...
    def __init__(self, user, *args, **kwargs):
        self.user = user
        self.register = RegisterForm
        super().__init__(*args, **kwargs)

    def clean(self):
        password1 = self.cleaned_data.get('new_password')
        password2 = self.cleaned_data.get('confirm_new_password')
        self.register.clean(self, password1, password2, error_key="new_password")
        return self.cleaned_data

Я хочу композицию класса и функции и переопределить это в django, я создал свой собственный User, и теперь я создал свою собственную валидацию, но я не хочу дублировать строки кода. Почему эта вторая функция clean не работает правильно? ;/

В этой строке вы вызываете чистый метод RegisterForm.

self.register.clean(self, password1, password2, error_key="new_password")

Но вы создаете форму и не задаете данные, и форма не имеет данных для валидации:

class SetPasswordsForm(forms.Form):
    def __init__(....):
        self.register = RegisterForm

Дополнительно метод RegisterForm's clean устанавливает параметры, которые затем перезаписываются значениями из cleaned_data. Очевидно, что эти параметры не имеют никакого эффекта:

def clean(self, password1, password2, error_key="password"):
        symbols = ['$', '@', '#', '%', '!']
        password1 = self.cleaned_data.get('password')
        password2 = self.cleaned_data.get('password2')

Не изобретайте колесо. Используйте инструменты, предоставляемые Django. Если вам нужно написать валидаторы форм и повторно использовать код, вы можете начать здесь: https://docs.djangoproject.com/en/3.2/ref/validators/

Вернуться на верх