0

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

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

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

我在这里做错了什么?

4

2 回答 2

5

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

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

例如,默认白名单设置为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
于 2015-02-16T10:44:17.087 回答
0

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

以下代码查看EmailValidator

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

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

于 2015-02-16T08:07:37.120 回答