Django - 即使数据无效,ModelForm也在保存

时间:2011-01-25 03:46:28

标签: python django django-templates django-forms

排序。

我有一个像这样定义的模型:

class EditUserForm(UserForm):
    def __init__(self,data=None,instance=None):
        UserForm.__init__(self,data=data,instance=instance)
        del self.fields['username']

我这样做是因为我想排除在EditUserForm上显示的用户名字段,但因为我覆盖了UserForm中的用户名字段,django中的一个错误阻止了这个工作,所以我用这种方式编写了表单。

我的观看代码如下所示:

if request.method == 'POST':
        uf = EditUserForm(request.POST,instance=user)
        upf = StudentProfileForm(request.POST,instance=profile)
        if uf.is_valid() and upf.is_valid(): 
            print 'VALID'
            uf.save()
            upf.save()
            messages.success(request, 'You have successfully updated your profile.')
            return HttpResponseRedirect('/student/editprofile')
        else:
            print 'INVALID'

为了测试它,我尝试更改名字并使密码不匹配,当我提交时,我注意到打印了INVALID(正确显示了密码验证错误)但是在页面顶部我有“欢迎”(用户名()用户姓)“我注意到名字已经改变了。当我转到另一个页面时,它会返回到正确的值。我怎么能不发生这种情况?

这是我的HTML代码:

{% if user.is_authenticated %}
    Welcome, <a href = "/{{user.get_profile.getType}}/profile">{{user.first_name}} {{user.last_name}}</a> | 
    <a href = "/auth/logout">Logout</a>
{% else %}
{% endif %}

我猜测发生了什么,当我发布数据时,它会将user.first_name置于上下文中,覆盖实际的user.first_name。但它无效,因为数据尚未保存......

那么,如何在发布的模板中使用user.first_name而不更改它的值,直到它实际有效?

1 个答案:

答案 0 :(得分:0)

你的假设是对的。验证后,ModelForm会使用给定的user更新给定的实例(data),使其处于无效状态。

你可以:

  • 尝试创建user
  • 的副本
  • 从数据库重新加载user
  • 或将user.first_name存储在临时变量中,并在验证失败时将其设置回来

编辑:请注意,尽管ModelForm会修改实例,但它不会保存它。