Django EmailField接受无效值

Sta*_*ato 10 django django-forms

我目前正在使用EmailField表单上的默认属性.我遇到的问题是表单认为无效的电子邮件name@mail.56是有效的.我是否需要validators在此字段上实现自己的功能才能使其正常工作?

我的印象是:

#models.py
email = models.EmailField(max_length=254, blank=False, unique=True,
        error_messages={'required': 'Please provide your email address.',
                        'unique': 'An account with this email exist.'},)
Run Code Online (Sandbox Code Playgroud)

或者:

#forms.py
email = forms.EmailField()
Run Code Online (Sandbox Code Playgroud)

我会照顾这种类型的验证,但似乎并非如此.

ale*_*cxe 16

确实,name@mail.56电子邮件是django的有效电子邮件EmailValidator,看到没有错误:

>>> from django.core.validators import validate_email
>>> validate_email("name@mail.56")
>>>
Run Code Online (Sandbox Code Playgroud)

Django(1.5.1)使用以下正则表达式验证电子邮件地址:

r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*"  # dot-atom
    # quoted-string, see also http://tools.ietf.org/html/rfc2822#section-3.2.5
    r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\177])*"'
    r')@((?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)$)'  # domain
    r'|\[(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\]$'
Run Code Online (Sandbox Code Playgroud)

它实际上遵循RFC2822标准.

如果要name@mail.56在验证期间失败,可以创建自己的验证器,并将其添加到EmailField具有内置validate_email验证器的验证器,如下所示:

from django.core.validators import validate_email
from django.core.exceptions import ValidationError

def custom_validate_email(value):
    if <custom_check>:
        raise ValidationError('Email format is incorrect')
...
email = models.EmailField(max_length=254, blank=False, unique=True, validators=[validate_email, custom_validate_email)
Run Code Online (Sandbox Code Playgroud)

而且,仅供参考,您可以随时在django票务系统中提交票证或在django IRC频道上询问有关问题(irc://irc.freenode.net/django).

另请参阅:编写验证器.

希望有所帮助.


Adr*_*ián 5

你可以在这里看到使用的正则表达式.

我认为它不会丢弃100%的错误电子邮件.这就是为什么它在文档中说:

使用中等复杂的正则表达式验证给定值是否为有效的电子邮件地址.

我从中理解的是,由于设计决策(它将是性能权衡),它没有做出完美的验证.

最后,我很确定您的示例name@mail.56 是有效的电子邮件.电子邮件地址的域部分可以是IP(IPv4和IPv6)或主机名.有关该主题的更多信息,请参见此处.