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 проверку введённых паролей дублировать не нужно или, всё-таки, какие-то необходимы?