我对 django EmailField 有同样的小问题。
forms.EmailField(required=True, label="E-mail", widget=forms.TextInput(attrs=
它不接受表单中的电子邮件
xx.@xxxxxxx.xxx
它会返回格式不正确的错误消息,但电子邮件正常工作(电子邮件已有 15 年历史)。我认为 at-sign 之前的点是问题所在。
它是一个错误吗?是否有任何解决方案使其适用于此类电子邮件?
多谢 :)
我对 django EmailField 有同样的小问题。
forms.EmailField(required=True, label="E-mail", widget=forms.TextInput(attrs=
它不接受表单中的电子邮件
xx.@xxxxxxx.xxx
它会返回格式不正确的错误消息,但电子邮件正常工作(电子邮件已有 15 年历史)。我认为 at-sign 之前的点是问题所在。
它是一个错误吗?是否有任何解决方案使其适用于此类电子邮件?
多谢 :)
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]+
它之后!所以没有机会\.
!!!
在RFC 5321的第 4.2.1 节中,地址的“本地部分”具有以下语法:
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-string。
如果我解释正确,那么一个原子必须始终跟在一个点之后,您的电子邮件地址正式无效,例如连续两个点也是无效的。
尽管像 GMail 这样的服务器选择只过滤掉本地部分的所有点并接受这些地址,但这并不能使它们正式有效。
引用本地部分 ( "xx."@xxxx.xxx
) 应该可以,但您也可以编写自定义验证器和您自己的 EmailField 子类。
正如其他人所说,也许这不是一个有效的电子邮件地址。但作为一种解决方法,你可以做这样的事情。我没有把正则表达式放进去,但希望你明白:
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 以获得有关如何制作正则表达式的想法。