【问题标题】:Django forms EmailValidation not workingDjango表单EmailValidation不起作用
【发布时间】:2015-04-16 16:15:51
【问题描述】:

我一直在研究这个问题,但似乎没有太多关于这个问题的解释。

...
class RangerRegistrationForm(RegistrationFormUniqueEmail):
    email = forms.EmailField(label=_("Email Address"), validators=[EmailValidator(whitelist=['gmail.com'])])
...

这是我检查用户是否提供 gmail 帐户的脚本部分。不幸的是,只要它是有效的电子邮件,它就会始终通过检查。

我在这里做错了什么?

【问题讨论】:

标签: django django-forms django-validation


【解决方案1】:

这不是 Django 中的错误(重新阅读@catavaran 的答案中发布的源代码链接)。

在这种情况下,whitelist 不是“阻止除此域部分之外的所有内容”解决方案。相反,whitelist 是一个域部分,否则它会被 Django 的EmailValidator 标记为无效。

例如,default whitelist 设置为 domain_whitelist = ['localhost']...否则无效的 domain_part 被标记为适用于此用例。

要验证电子邮件字段的域部分,您需要编写自己的 clean 函数。比如:

class RangerRegistrationForm(forms.Form):
    email = forms.EmailField(label=_("Email Address"))

    def clean_email(self):
        submitted_data = self.cleaned_data['email']
        if '@gmail.com' not in submitted_data:
            raise forms.ValidationError('You must register using a Gmail address')
        return submitted_data

【讨论】:

  • 哦,好吧,我明白了。那我就用错了。希望像您那样在文档中更好地解释它。这真的是误导。
【解决方案2】:

恭喜!你在 Django 中发现了一个错误。

EmailValidatorthis code

if (domain_part not in self.domain_whitelist and
        not self.validate_domain_part(domain_part)):
    ...

如果电子邮件的域部分有效,则检查 self.domain_whitelist 将被忽略。

【讨论】:

  • 现在很不幸!可能必须使用解决方法。感谢 catavaran 指出这一点。
  • 有人举报了吗?
  • @rnevius 我找不到这个问题的票。
  • 乍一看,这真的是一个错误吗?除了白名单值之外,此功能似乎与将所有内容列入黑名单无关......它似乎只允许传递一个本来会被标记为无效的自定义域(即,将一个否则无效的domain_part 列入白名单)。如果是这样,我不确定这个答案是否正确。
  • 我不知道,但除了这两行之外,脚本中似乎没有任何行处理白名单。如果您参考 EmailValidator 文档,您实际上可以将无效的 domain_part 列入白名单(例如“本地”)
猜你喜欢
  • 2015-12-03
  • 2017-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
相关资源
最近更新 更多