self.cleaned_data.get не возвращает ничего, даже если поле было объявлено - PullRequest
1 голос
/ 28 апреля 2019

Когда я нахожусь на странице администратора и пытаюсь создать новый экземпляр MyUser, я не могу его создать.Когда я печатаю password и confirm_password, я получаю правильное значение для password, но None для confirm_password.

В моем файле admins.py есть следующее:

class MyUserCreationForm(forms.ModelForm):
    """
    A form for creating new users.
    """
    password = forms.CharField(label='Password', widget=forms.PasswordInput)
    confirm_password = forms.CharField(
        label='Confirm password', widget=forms.PasswordInput)

    class Meta:
        models = MyUser
        fields = ('email', )

    def clean_password(self):
        """
        Check if two password entries match.
        """
        password = self.cleaned_data.get('password')
        confirm_password = self.cleaned_data.get('confirm_password')
        if (password == confirm_password):
            return password
        else:
            raise forms.ValidationError("Passwords don't match")

    def save(self):
        """
        Save the provided password in hash format.
        """
        user = super().save(commit=False)
        user.set_password(self.cleaned_data['password'])
        user.save()
        return user

Что может быть причиной того, почему confirm_password всегда имеет значение None?

1 Ответ

1 голос
/ 28 апреля 2019

Вы не должны делать этот код в clean_password.

Более разумно делать это внутри clean_confirm_password Вот фрагмент кода, извлеченный из исходного кода django:

def clean_confirm_password(self):
        password = self.cleaned_data.get("password")
        confirm_password = self.cleaned_data.get("confirm_password")
        if password and confirm_password and password != confirm_password:
            #you can keep your simply Validation Error here
            raise forms.ValidationError(
                self.error_messages['password_mismatch'],
                code='password_mismatch',
            )
    return password2

И длясохранить попытку:

 def save(self, commit=True):
    user = super().save(commit=False)
    user.set_password(self.cleaned_data["password"])
    if commit:
        user.save()
    return user

В противном случае ваш код кажется хорошим.Так что, возможно, ошибка в другом месте.

Здесь для вашей информации: https://github.com/django/django/blob/master/django/contrib/auth/forms.py#L70

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...