2014-10-07 106 views
1

我在Django以下形式: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_email作为见于django.core.validators。另外,这里是我的观点的相关部分:

form = UserEmailRegistrationForm(PUT)  
    # Validate incoming data 
    if not form.is_valid(): 
     return HttpResponse(form.errors.as_json(), 
          content_type='application/json', status=422) 

所有验证工作正常,但我得到Enter a valid email address.两次form.errors当我沿着无效的电子邮件地址传递。这是我得到的回应:

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

什么可能导致这种情况,我该如何解决它?

回答

3

调试/查看发生了什么。在您的IDE点击EmailField,并按照层级...

贵国码:

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

2.EmailField:

class EmailField(CharField): 
    widget = EmailInput 
    default_validators = [validators.validate_email] 

3.CharField /什么有趣的。

class CharField(Field): ... 

4. Field.__init__(...)

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

总之,你使用validate_email两次。

+0

定了!但这是一种奇怪的行为。也许这个参数应该被称为“extra_validators”,它会更合理。 – 2014-10-07 14:51:01

1

正如弗朗索瓦暗示的那样,两个与您的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个注册的验证器。当窗体验证都被执行:

>>> email.run_validators('[email protected]') 
>>> 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.', u'Enter a valid email address.'] 

要解决,只需声明电子邮件字段不验证:

>>> email = forms.EmailField(label=_('Email')) 
>>> email.validators 
[<django.core.validators.EmailValidator object at 0x2bc0190>] 
>>> email.run_validators('[email protected]') 
>>> 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.']