django EmailField指向@之前

时间:2014-11-20 09:30:50

标签: python django emailfield

我和django EmailField有同样的小问题。

forms.EmailField(required=True, label="E-mail", widget=forms.TextInput(attrs=

它不接受表单中的电子邮件

  

XX。@ xxxxxxx.xxx

它会丢弃错误格式的错误消息,但电子邮件通常正常工作(电子邮件是15岁)。 我认为at-sign之前的问题就是问题。

这是一个错误吗?是否有任何解决方案可以使其适用于这类电子邮件?

很多:)

3 个答案:

答案 0 :(得分:2)

RFC 5321第4.2.1节中," local-part"地址的语法如下:

Local-part     = Dot-string / Quoted-string
                 ; MAY be case-sensitive


Dot-string     = Atom *("."  Atom)

Atom           = 1*atext

我解释这个的方式是Atom必须至少有一个字符,而Dot-string是一个或多个Atom,它们之间有点,而Local-part是Dot-string或Quoted-字符串。

如果我正确解释,那么原子必须始终跟在点之后,你的电子邮件地址正式无效,例如连续两个点也无效。

即使像GMail这样的服务器选择过滤掉本地部分中的所有点并接受这些地址,但这并不能使它们正式有效。

引用本地部分("xx."@xxxx.xxx)应该有效,但您也可以编写自定义验证器和您自己的EmailField子类。

答案 1 :(得分:2)

EmailFieldCharField,用于检查该值是否为有效的电子邮件地址。它使用EmailValidator来验证输入。

EmailValidator课程按以下方式拆分您的电子邮件:

user_part, domain_part = value.rsplit('@', 1) 

因此user_part@之前的部分。并EmailValidator通过此正则表达式检查它的验证:

user_regex = re.compile(
    r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*$"  # dot-atom
    r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\177])*"$)',  # quoted-string
    re.IGNORECASE)

正如您在\.之前看到的@不可能,\.之后[-!#$%&'*+/=?^_`{}|~0-9A-Z]+就会出现\.!所以{{1}}没有机会!

答案 2 :(得分:0)

正如其他人所说,也许这不是一个有效的电子邮件地址。但作为一种解决方法,你可以做这样的事情。我没有把正则表达式放入,但希望你能得到这个想法:

from django.core.validators import EmailValidator
from django.db import models

class MyEmailValidator(EmailValidator):
    user_regex = re.compile('ALTERED REGULAR EXPRESSION')

class MyModel(models.Model):
    forms.EmailField(required=True, label="E-mail", validators=[MyEmailValidator()])

您可以查看django.core.validators.EmailValidator,了解如何制作正则表达式。