Django表单验证失败(更新时)

时间:2013-09-16 12:13:24

标签: django forms validation duplicates

我正在与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中,我总是收到重复的用户名错误,因此表单始终无效。

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

3 个答案:

答案 0 :(得分:2)

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

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

您应使用UserChangeForm之类的相应表单,或者如果您的应用仅更新密码等特定字段,请从built in forms中选择。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

UserCreationForm的{​​{1}}具有以下代码:

clean_username()

如果成功,则会收到错误消息。由于您的用户(User._default_manager.get(username=username) )已经存在,因此您始终会收到错误消息。正如@sudipta所建议的,你最好使用admin

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