В Django {{user.username}} и {{request.user.username}} возвращают неверное имя пользователя в шаблоне
Я довольно новичок в программировании в целом и работаю над веб-приложением Django. Я использую форму ChangeUserData для обновления данных учетной записи пользователя (я использую стандартную модель django.contrib.auth User). Когда попытка пользователя изменить имя пользователя не удается, потому что новое имя пользователя уже используется, шаблон отображается снова, вместе с соответствующим сообщением об ошибке.
Однако, вход "имя пользователя" в форме отображает "новое" имя пользователя, т.е. то, которое было отклонено из-за того, что уже используется. Меня это удивляет/смущает, поскольку в шаблоне я использую {{ request.user.get_username }} для заполнения этого входа. Разве это не должно вставлять настоящее - неизменное - имя пользователя?
Я также пробовал {{ user.username }} и {{ user.get_username }}, но они дают тот же результат.
Ниже приведены выдержки из соответствующих файлов:
views.py
def MyAccount(request):
if request.method == 'POST':
form = forms.ChangeUserData(request.POST, instance=request.user)
if form.is_valid():
form.save(commit=True)
return redirect('home')
else:
return render(request, 'accounts/myAccount.html', { 'form' : form })
else:
return render(request, 'accounts/myAccount.html')
myAccount.html
<input type="text" class="inputLocked" name="username" required autocapitalize="none" value="{{user.get_username}}" id="id_username" readonly>
Вы также должны отправить пустой ChangeUserData для заполнения пользователем в GET условии, когда данные не получены из POST запроса.
После того, как валидация не прошла, вам не нужно использовать render для полного отображения HttpResponse, здесь лучшим выбором будет использование messages[django-doc] фреймворка, который в конечном итоге сообщит пользователю, какая валидация была провалена. Но если вы сделали ChangeUserData форму через Form Api, то я предполагаю, что вам не нужно этого делать, так как здесь вы можете определить error_messages внутри forms.
Чтобы получить текущее имя пользователя, попробуйте использовать request.user.username.
.
Note:Формы в Django требуют, чтобыFormбыл суффиксом, поэтому он должен бытьChangeUserDataForm, а неchangeUserData
Note:Представления на основе функций обычно пишутся вsnake_case, а не вPascalCase, поскольку так работают представления на основе классов, поэтому будет лучше, если вы измените это наmy_accountсMyAccount.
Попробуйте следующий код:
views.py
def my_account(request):
if request.method == 'POST':
form = forms.ChangeUserDataForm(request.POST, instance=request.user)
if form.is_valid():
form.save(commit=True)
return redirect('home')
else:
form=forms.ChangeUserDataForm() #Here empty form for get request.
return render(request, 'accounts/myAccount.html',{'form':form})
myAccount.html
<input type="text" class="inputLocked" name="username" required autocapitalize="none" value="{{request.user.username}}" id="id_username" readonly>