Django. Обработать исключение "password_mismatch"

Реализуется простая операция смены пароля пользователя в Django. При этом Django бросает исключение

KeyError "password_mismatch"

в определении параметров исключения в clean_new_password2(self) при проверке формы pwd_form.is_valid(). Непонятно, как решить проблему этого исключения средствами формы, унаследованной от встроенной PasswordChangeForm:

метод Django:

def clean_new_password2(self):
        password1 = self.cleaned_data.get('new_password1')
        password2 = self.cleaned_data.get('new_password2')
        if password1 and password2:
            if password1 != password2:
                raise forms.ValidationError(
                    self.error_messages['password_mismatch'], …
                    code='password_mismatch',
                )
        password_validation.validate_password(password2, self.user)
        return password2

forms.py

class PasswordChangeCustomForm(PasswordChangeForm): 
    error_css_class = 'red' 
    error_messages = {'password_incorrect': "Старый пароль неверен. Попробуйте ещё раз!"}
    # поля формы
    old_password = forms.CharField(required=True, widget=forms.PasswordInput(attrs={ 'class': 'form-control'}), error_messages={ 'required': 'Требуется ввести старый пароль!'}) 
    new_password1 = forms.CharField(required=True, widget=forms.PasswordInput(attrs={ 'class': 'form-control'}), error_messages={ 'required': 'Введите новый пароль!'}) 
    new_password2 = forms.CharField(required=True, widget=forms.PasswordInput(attrs={ 'class': 'form-control'}), error_messages={ 'required': 'Введите новый пароль ещё раз!'})

views.py

def change_password(request):
    ''' Обработка формы смены пароля пользователя. '''
    user = User.objects.filter(username=request.user).first()
    pwdChangeResult = ''
    pwd_form = PasswordChangeCustomForm(user, request.POST or None)
    if request.method == 'POST':
        if pwd_form.is_valid(): # ошибка "password_mismatch"
            old_password = pwd_form.cleaned_data['old_password']
            new_password1 = pwd_form.cleaned_data['new_password1']
            new_password2 = pwd_form.cleaned_data['new_password2']
            if check_password(old_password, user.password): 
                if new_password1 == new_password2:  
                    user.set_password(new_password2)
                    user.save()
                    pwdChangeResult = 'Пароль успешно изменён!'
                else:
                    pwdChangeResult = 'Новые пароли не совпадают!'
            else:
                pwdChangeResult = 'Старый пароль неверен!' 

    context = {'pwd_form': pwd_form, 'pwdChangeResult': pwdChangeResult, 'error': pwd_form.errors} 
    return context 

Похоже, что и во view change_password проверку введённых паролей дублировать не нужно или, всё-таки, какие-то необходимы?


Ответы (0 шт):