Django表单验证错误被复制

2024-04-18 22:57:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我在django有以下表格:

class UserEmailRegistrationForm(forms.Form):
    password = forms.PasswordField(max_length=32, label=_('Password'),
                                   validators=[validators.validate_password])
    email = forms.EmailField(label=_('Email'), 
                             validators=[validators.validate_email])
    first_name = forms.CharField(max_length=35, label=_('First name'), 
                                 validators=[validators.validate_name])
    last_name = forms.CharField(max_length=35, label=_('Last name'), 
                                validators=[validators.validate_name])

大多数验证器都是自定义的,但是validate_emaildjango.core.validators所示。另外,我的观点也与此相关:

^{pr2}$

所有的验证器都工作正常,但是当我传递一个无效的电子邮件地址时,Enter a valid email address.两次出现在form.errors中。我得到的回答是:

{"email": [{"message": "Enter a valid email address.", "code": "invalid"}, {"message": "Enter a valid email address.", "code": "invalid"}]}

是什么原因造成的?我该如何解决?在


Tags: djangonamemessageaddressemailformspasswordvalidate
2条回答

调试/查看发生了什么。在IDE中,单击EmailField并遵循层次结构。。。在

1.您的代码:

email = forms.EmailField(label=_('Email'), 
                         validators=[validators.validate_email])

2.电子邮件字段:

^{pr2}$

3.查菲尔德/没什么有趣的。在

class CharField(Field): ...

4.Field.__init__(...)

...
self.validators = self.default_validators + validators
super(Field, self).__init__()

简而言之,您使用validate_email两次。在

正如fraçois所暗示的,有两个相同的验证器与您的email字段关联。第一个在默认情况下是存在的,然后通过为validators关键字参数(validators=[validators.validate_email])提供一个值来添加第二个。此验证器列表会附加到任何默认值。因此,您将看到2条验证错误消息。在

$ python manage.py shell
>>> from django import forms
>>> from django.core import validators
>>> email = forms.EmailField(label=_('Email'), validators=[validators.validate_email])
>>> email.validators
[<django.core.validators.EmailValidator object at 0x2bc0190>, <django.core.validators.EmailValidator object at 0x2bc0190>]

所以您可以看到上面有2个注册的验证器。当表单被验证时,两者都将被执行:

^{pr2}$

要修复此问题,只需声明不带验证器的email字段:

>>> email = forms.EmailField(label=_('Email'))
>>> email.validators
[<django.core.validators.EmailValidator object at 0x2bc0190>]
>>> email.run_validators('abc@abc.com')
>>> email.run_validators('abc')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/mhawke/virtualenvs/django_1.6/lib/python2.7/site-packages/django/forms/fields.py", line 139, in run_validators
    raise ValidationError(errors)
ValidationError: [u'Enter a valid email address.']

相关问题 更多 >