2011-01-25 100 views
0

类别。Django - 即使数据无效,ModelForm仍在保存

我已经定义了,就像这样的ModelForm:

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

我这样做是因为我想从显示在我的EditUserForm排除用户名字段,而是因为我重写了在用户窗体用户名字段,在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' 

为了测试它,我试图改变名字,使密码不匹配,我提出时,我注意到的无效印刷(正确地出现在密码验证错误)但在我有“欢迎(用户的名字)(用户姓氏)”页面的顶部“我注意到名字已经改变。当我转到不同的页面时,它会回到正确的值。我如何使这不发生?

这是我的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

请显示该视图的其余代码。 – 2011-01-25 07:13:11

回答

0

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

,你可以:

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

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

+0

我想我可以做的是在我的UserProfile中创建一个“display_name”字段,并使用它在模板中显示用户名。在UserProfile保存中,我将设置display_name = user.first_name + user.last_name – JPC 2011-01-25 18:22:33

相关问题