在Django中{{user.用户名}}和{{request.user.返回模板中错误的用户名 &g



我对编程相当陌生,我在Django Web-App上工作。我使用ChangeUserData表单来更新用户的帐户数据(我使用标准django.contrib.auth用户模型)。当用户尝试更改用户名失败时,因为新用户名已经在使用中,该模板将再次显示,同时显示相关的错误消息。

然而,"用户名"表单中的输入将显示"new"用户名,即已经在使用而被拒绝的用户名。我对此感到惊讶/困惑,因为在模板中我使用{{ 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>

GET条件下,当数据不是来自POST请求时,也应该发送空的ChangeUserData供用户填写。

验证失败后,你不需要使用render来完全渲染HttpResponse,这里最好的选择是使用messages[django-doc]框架,它最终会告诉用户哪个验证失败了。但是如果你已经通过表单Api制作了ChangeUserData表单,那么我认为你不需要这样做,因为在这里你可以在表单中定义error_messages

要获取当前用户名,请尝试使用request.user.username

Note:Django中的Forms需要Form作为后缀,所以必须是ChangeUserDataForm而不是changeUserData

Note:基于函数的视图通常在snake_case而不是PascalCase中编写,因为这是基于类的视图工作的方式,所以如果将其从MyAccount更改为my_account会更好。

试试下面的代码:

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>

相关内容

  • 没有找到相关文章

最新更新