【问题标题】:Django - ModelForm is saving even though data is invalidDjango - 即使数据无效,ModelForm 也会保存
【发布时间】:2011-01-25 03:46:28
【问题描述】:

有点。

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

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(密码验证错误正确出现)但在页面顶部我有“欢迎( users first name) (the users last name)” 我注意到名字已经改变了。当我转到不同的页面时,它会回到正确的值。我怎样才能避免这种情况发生?

这是我的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 而不会更改它的值,直到它真正有效??

【问题讨论】:

  • 请显示该视图的其余代码。

标签: python django django-templates django-forms


【解决方案1】:

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

你可以:

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

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

【讨论】:

  • 我想我可以在我的 UserProfile 中创建一个“display_name”字段,并使用它在模板中显示用户名。在 UserProfile 保存时,我将设置 display_name = user.first_name+user.last_name
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
相关资源
最近更新 更多