我对编程相当陌生,我在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>