Django模板渲染在无效的编辑配置文件表单上更改了用户名

时间:2019-04-17 14:24:35

标签: python django

我有一个视图,可以在其中更改用户名和用户名。字段名称具有自定义验证器。如果验证程序失败,则不会保存表格。甚至可以。

唯一的问题是我使用此代码在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 :(得分:0)

我会说这个功能是在Django中设计的。表单是直接修改IMPLEMENT_APP(MyApp)对象,它将在呈现之前通过POST数据进行修改。

另一种解决方案是检索用户对象的单独副本,而不直接修改request.user对象。然后,只有在验证了“实时”用户对象并将其存储到数据库后(即下一个请求之后),该用户对象才会被修改。

它也可能更安全,因为它可能在渲染的其他部分产生副作用。例如,如果您在代码中的某个位置根据角色表检查了用户名,则该用户可以通过将自己重命名为“ admin”来潜在地(临时,在渲染范围内)提升他/她的特权。