我有一个视图,可以在其中更改用户名和用户名。字段名称具有自定义验证器。如果验证程序失败,则不会保存表格。甚至可以。
唯一的问题是我使用此代码在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} )
答案 0 :(得分:0)
我会说这个功能是在Django中设计的。表单是直接修改IMPLEMENT_APP(MyApp)
对象,它将在呈现之前通过POST数据进行修改。
另一种解决方案是检索用户对象的单独副本,而不直接修改request.user
对象。然后,只有在验证了“实时”用户对象并将其存储到数据库后(即下一个请求之后),该用户对象才会被修改。
它也可能更安全,因为它可能在渲染的其他部分产生副作用。例如,如果您在代码中的某个位置根据角色表检查了用户名,则该用户可以通过将自己重命名为“ admin”来潜在地(临时,在渲染范围内)提升他/她的特权。