【问题标题】:Django form validation fails (on update)Django 表单验证失败(更新时)
【发布时间】:2013-09-16 12:13:24
【问题描述】:

我现在正在与 Django 表单验证作斗争。我正在使用非常基本的代码。使用 ajax 请求返回表单数据是唯一特殊的事情,但我认为这不是我的问题的原因。 我正在尝试更新用户条目。我创建了一个用户实例,并将该实例输入 CreateForm(),但我仍然收到重复的用户名错误。

这是视图的一部分:

def user_update(request):
    if request.is_ajax():
        print request.POST
        user = User.objects.get(pk=int(request.POST['pk']))
        print user
        form = UserCreateForm(request.POST, instance=user)
        print form
        if form.is_valid():
            form_cleaned = form.cleaned_data
        else:
            print '### form is invalid ###'
            print form.error_messages

request.POST 的输出是:

<QueryDict: {u'username': [u'testuser'], u'password1': [u'test'], u'password2': [u'test'], u'pk': [u'27'], u'csrfmiddlewaretoken': [u'wyBoaBAlxLTO952BzWSxR7HMK6W7nsAM'], u'email': [u'soso@soso.so']}>

print user 的输出是:

testuser

print form 我总是收到重复的用户名错误,因此表单总是无效的。

请给我一个提示。非常感谢。

【问题讨论】:

  • 恕我直言,如果用户已经通过身份验证,设置 instance=user 将是错误的,我认为这就是产生错误的原因。
  • 如果您尝试更新用户,为什么要使用UserCreateForm?你应该改用UserChangeForm
  • @equinoxel:试图更改其他用户记录的用户(如管理员)。第一个是经过身份验证的,但据我所知,我需要创建一个我想要更新的用户实例,因为 Django 会尝试创建该用户。
  • @Burhan Khalid:好的,使用 CreateForm 来更改用户记录看起来很奇怪。我认为这没问题,因为 CreateForm 包含与用户相关的所有字段,因此也可以用于更新用户。

标签: django forms validation duplicates


【解决方案1】:

对于表单验证,您使用了UserCreateForm

除了字段的常规正则表达式验证外,UserCreateForm 还检查给定用户名是否可用。任何现有用户都将无法通过此检查。

您应该使用适当的表单,例如 UserChangeForm,或者如果您的应用程序仅更新密码等特定字段,则从 built in forms 中进行选择。

【讨论】:

  • 谢谢 Sudipta,看来我低估了这些表单函数的威力。我想做的就是更新用户字段的子集(如用户名、电子邮件地址、名字和姓氏),并使用表单验证来检查和清理返回的数据。如果我想使用 UserChangeForm 来执行此操作,我是否需要返回生成的论坛提供的所有数据,或者它是否可以与子集一起使用?
  • 您可以创建一个继承自 UserChangeForm 的自定义用户表单,然后仅指定您希望在其中可编辑的字段
【解决方案2】:

参考 django 中的UserCreationForm,它具有clean_username() 验证方法,用于检查具有给定用户名的用户是否已经存在,如果存在则会引发您得到的验证错误。

如果您想更新用户字段,最好使用UserChangeForm

【讨论】:

  • 感谢 Rohan,请看我对 Sudipta 答案的评论,因为你们两个提供了相同的答案...
  • @32smooth,更改 username 并非易事。就像添加新用户一样,所以我认为它不适合通过更新更改username。如果您想要不属于UserUpdateForm 的字段,您可以编写表单(从默认表单继承)并使用它。
【解决方案3】:

UserCreationFormclean_username() 代码如下:

User._default_manager.get(username=username)

如果成功,您将收到错误消息。由于您的用户 (admin) 已经存在,因此您总是会收到错误消息。正如@sudipta 所建议的,您最好使用UserChangeForm

恕我直言,您可以使用自己的行为定义自己的自定义表单,而不是使用库存表单并偏离其原始目的。

【讨论】:

    猜你喜欢
    • 2014-11-01
    • 2017-01-25
    • 2014-12-14
    • 2014-04-18
    • 2018-09-13
    • 2018-08-01
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多