我和django EmailField有同样的小问题。
forms.EmailField(required=True, label="E-mail", widget=forms.TextInput(attrs=
它不接受表单中的电子邮件
XX。@ xxxxxxx.xxx
它会丢弃错误格式的错误消息,但电子邮件通常正常工作(电子邮件是15岁)。 我认为at-sign之前的问题就是问题。
这是一个错误吗?是否有任何解决方案可以使其适用于这类电子邮件?
很多:)
答案 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)
EmailField
是CharField
,用于检查该值是否为有效的电子邮件地址。它使用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,了解如何制作正则表达式。