Визуализация шаблона Django изменила имя пользователя при неверном редактировании формы профиля - PullRequest
1 голос
/ 17 апреля 2019

У меня есть вид, где можно изменить имя пользователя и имя пользователя. Имя поля имеет пользовательские валидаторы. Если валидаторы не пройдены, форма не сохраняется. Это даже работает.

Единственная проблема заключается в том, что я отображаю имя пользователя в моем шаблоне base.html с этим кодом

Login as {{ user.username }}

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

Когда я перехожу на другой URL, имя пользователя корректно (это неизменное значение).

Можете ли вы помочь мне с этим? В моем коде это похоже на ошибку, а не на ошибку.

Код моего представления edit_profile.

def edit_profile(request):

    if request.method == 'POST':
        form = EditProfileForm(request.POST, instance=request.user)

        if form.is_valid():
            form.save()
            return redirect('profile')
        else:
            return render(request, 'accounts/edit_profile.html', {'form': form})

    form = EditProfileForm(instance=request.user)
    return render(request, 'accounts/edit_profile.html', {'form': form} )

1 Ответ

0 голосов
/ 17 апреля 2019

Я бы сказал, что эта функциональность разработана в Django. Форма изменяет объект request.user напрямую, он будет изменен данными POST перед отображением.

Альтернативным решением будет получение отдельной копии пользовательского объекта, а не непосредственное изменение объекта request.user. Затем «живой» объект пользователя изменяется только после того, как объект был проверен и сохранен в БД (т.е. после следующего запроса).

Вероятно, это также будет безопаснее, поскольку потенциально может иметь побочные эффекты в других частях рендеринга. Например, если где-то в вашем коде вы проверили имя пользователя по таблице ролей, пользователь потенциально (временно, для области визуализации) может повысить свои привилегии, переименовав себя в «admin».

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