Python 之前的django EmailField点@
我对django EmailField也有同样的小问题Python 之前的django EmailField点@,python,django,emailfield,Python,Django,Emailfield,我对django EmailField也有同样的小问题 forms.EmailField(required=True, label="E-mail", widget=forms.TextInput(attrs= 它不接受电子邮件的形式 xx.@xxxxxxx.xxx 它会返回格式不正确的错误消息,但电子邮件正常工作(电子邮件已存在15年)。 我认为问题出在at标志之前 是虫子吗?有什么解决方案可以让它在这类邮件中工作吗 Thx a lot:)在第4.2.1节中,地址的“本地部分”具有以下语法:
forms.EmailField(required=True, label="E-mail", widget=forms.TextInput(attrs=
它不接受电子邮件的形式
xx.@xxxxxxx.xxx
它会返回格式不正确的错误消息,但电子邮件正常工作(电子邮件已存在15年)。
我认为问题出在at标志之前
是虫子吗?有什么解决方案可以让它在这类邮件中工作吗
Thx a lot:)在第4.2.1节中,地址的“本地部分”具有以下语法:
Local-part = Dot-string / Quoted-string
; MAY be case-sensitive
Dot-string = Atom *("." Atom)
Atom = 1*atext
我的解释是,一个原子必须至少有一个字符,点字符串是一个或多个原子,原子之间有点,局部部分是点字符串或带引号的字符串
如果我的解释正确,那么原子必须始终紧跟在一个点之后,您的电子邮件地址正式无效,例如,一行中的两个点也是无效的
尽管像GMail这样的服务器选择只过滤掉本地部分的所有点并接受这些地址,但这并不意味着它们正式有效
引用本地部分(
“xx.”@xxxx.xxx
)应该可以,但您也可以编写自定义验证器和您自己的EmailField子类。EmailField
是一个检查值是否为有效电子邮件地址的字符域。它用于验证输入
forms.EmailField(required=True, label="E-mail", widget=forms.TextInput(attrs=
EmailValidator
类按以下行拆分您的电子邮件:
user_part, domain_part = value.rsplit('@', 1)
因此,用户部分
是@
之前的部分。和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]+
!所以没有机会使用\。
正如其他人所说,这可能不是一个有效的电子邮件地址。但作为一种解决办法,你可以做这样的事情。我还没有把正则表达式放进去,但希望您能理解:
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,了解如何构建正则表达式。如果它是一个bug,您应该这样做。我会等其他人先插话。根据标准,这个位置上的一个点可能实际上是无效的,即使它对你总是有效的。有人将不得不通过RFC2821左右进行搜索,并确定这是否是Django中的一个bug。您是否可以添加您得到的错误
?