Почему форма django публикуется с ошибками при обновлении экземпляра
У меня есть стандартная форма обновления пользователя вида
@login_required()
def personal(request):
if request.method == 'POST':
user_form = UserForm(request.POST, instance=request.user)
if user_form.is_valid():
user = user_form.save()
update_session_auth_hash(request, user)
messages.success(request, 'Your personal data has been changed successfully!')
return redirect('profile')
else:
user_form = UserForm(instance=request.user)
context = {
'form': user_form,
}
return render(request, 'personal.html', context)
Проблема здесь в строке user_form.is_valid()
. Она запускает логику валидации, которая собирает ошибку, если имя пользователя уже занято другим пользователем. В данном случае мы имеем ValidationError
, но instance
в этой форме все равно обновляется из-за кода в логике функции django construct_instance
:
def construct_instance(form, instance, fields=None, exclude=None):
"""
Construct and return a model instance from the bound ``form``'s
``cleaned_data``, but do not save the returned instance to the database.
"""
...
f.save_form_data(instance, cleaned_data[f.name])
...
Я нахожу такое поведение очень странным. Как я могу избежать обновления полей экземпляра пользователя неверными значениями, если мне нужно, скажем, отобразить имя пользователя в верхней части страницы?