0

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

请给我一个提示。提前谢谢了。

4

3 回答 3

2

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

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

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

于 2013-09-16T12:58:51.130 回答
1

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

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

于 2013-09-16T12:59:06.233 回答
0

的具有以下代码UserCreationFormclean_username()

User._default_manager.get(username=username)

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

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

于 2013-09-18T14:59:15.157 回答