Django cleaned_data.get ('obj') метод возвращает none

Raavan спросил: 28 марта 2018 в 03:30 в: python

Я делаю небольшую форму подтверждения пароля в django. Но Im запутался, поскольку self.cleaned_data.get('confirm_password') всегда возвращает ни одного и, следовательно, мои пароли никогда не совпадают друг с другом.

Здесь используется метод clean в forms.py

def clean_password(self):
    password = self.cleaned_data.get("password")
    confirm_password = self.cleaned_data.get("confirm_password")
    if password != confirm_password:
        print(password)
        print(confirm_password)
        raise forms.ValidationError(
        "Password and password confirmation does not match"
        )
    return password

self.cleaned_data.get('password') возвращает введенный пароль, но пароль confirm_password не работает.

В view.py, когда я вижу полученные данные перед очисткой, подтверждение_password показывает, что оно

......................user = UserRegister(request.POST)
        print(request.POST.get('confirm_password'))        if user.is_valid():
            print('valid')..........................

Что может быть причиной этого?

Вот часть объявления формы в

first_name = forms.CharField(required=True, widget=forms.widgets.TextInput(attrs={'placeholder': 'First Name'}))
last_name = forms.CharField(required=True, widget=forms.widgets.TextInput(attrs={'placeholder': 'Last Name'}))
username = forms.CharField(required=True, widget=forms.widgets.TextInput(attrs={'placeholder': 'Username'}))
email = forms.EmailField( required=True, widget=forms.widgets.EmailInput(attrs={'placeholder': 'Email'}))
password =forms.CharField(required=True, widget=forms.widgets.PasswordInput())
confirm_password =forms.CharField(required=True, widget=forms.widgets.PasswordInput())class Meta:
    model=User
    fields=['first_name','last_name','username','email','password','confirm_password']

3 ответа

Есть решение
neverwalkaloner ответил: 28 марта 2018 в 03:35
Методы

clean_fieldname вызываются в порядке объявления полей, поэтому на данный момент clean_password называется cleaned_data и не содержит confirm_password. Вы можете выполнить эту проверку в методе clean_confirm_password:

def clean_confirm_password(self):
    password = self.cleaned_data.get("password")
    confirm_password = self.cleaned_data.get("confirm_password")
    if password != confirm_password:
        print(password)
        print(confirm_password)
        raise forms.ValidationError(
        "Password and password confirmation does not match"
        )
    return password

или просто использовать метод clean для проверки, которая требует доступа к нескольким полям формы.

Raavan ответил: 28 марта 2018 в 03:44
Благодаря тонну. Ура, приятель.
kagronick ответил: 28 марта 2018 в 03:38

Методы clean_<fieldname>() вызываются при проверке полей. Вы не можете рассчитывать на то, что другие поля, находящиеся в cleaned_data, ожидают того поля, с которым вы работаете. Если вам нужно работать с несколькими полями, переопределите метод clean () формы.

T.Tokic ответил: 28 марта 2018 в 03:44

Поскольку вы выполняете проверку между несколькими полями, вы должны переопределить метод clean формы.

def clean(self):
    cleaned_data = super().clean()
    password = self.cleaned_data.get("password")
    confirm_password = self.cleaned_data.get("confirm_password")
    if password != confirm_password:
        print(password)
        print(confirm_password)
        raise forms.ValidationError(
        "Password and password confirmation does not match"
        )
    return cleaned_data