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

#python #django #forms

#python #django #формы

Вопрос:

 class RegisterForm(forms.ModelForm):
    ...
    class Meta:
        model = CreateUser
        ...
    def clean(self, password1, password2, error_key="password"):
        symbols = ['

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


Ответ №1:

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

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

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

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

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

 def clean(self, password1, password2, error_key="password"):
        symbols = ['

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



, '@', '#', '%', '!']
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, я создал своего собственного пользователя, и теперь я создал свою собственную проверку, но я не хочу дублировать строки кода.
Почему эта вторая функция clean работает некорректно? ;/

Ответ №1:

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


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


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


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

, '@', '#', '%', '!']
password1 = self.cleaned_data.get('password')
password2 = self.cleaned_data.get('password2')

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

, ‘@’, ‘#’, ‘%’, ‘!’]
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, я создал своего собственного пользователя, и теперь я создал свою собственную проверку, но я не хочу дублировать строки кода.
Почему эта вторая функция clean работает некорректно? ;/

Ответ №1:

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


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


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


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