django-注册电子邮件域名白名单

时间:2016-02-23 14:05:59

标签: python django

我正在尝试为我项目的注册表单设置一个电子邮件域名白名单。

我正在使用django-registration

这是我的注册'网址规则

urlpatterns = [
    ...
    url(r'^register/$',
        RegistrationView.as_view(),
        { 'form_class': EmailDomainFilterRegistrationForm },
        name='registration_register'),
    ...
]

这是我创建的EmailDomainFilterRegistrationForm课程

from django.core.validators import EmailValidator

from registration.forms import RegistrationForm

class EmailDomainFilterRegistrationForm(RegistrationForm):
    def __init__(self, *args, **kwargs):
        super(EmailDomainFilterRegistrationForm, self).__init__(*args, **kwargs)
        self.fields['email'].validators = [
            EmailValidator(whitelist=['epita.fr', 'lrde.epita.fr']),
        ]

问题是白名单根本没有应用。我可以注册任何我想要的电子邮件。

我做错了什么?

  

Django版本1.9.2

1 个答案:

答案 0 :(得分:0)

以下是如何做到的(正确的方法)。

创建registration.forms.RegistrationForm的子类:

class EmailDomainFilterRegistrationForm(RegistrationForm):

    def clean_email(self):
        submitted_data = self.cleaned_data['email']

        if not ALLOWED_DOMAINS: # If we allow any domain
            return submitted_data

        domain = submitted_data.split('@')[1]
        logger.debug(domain)
        if domain not in ALLOWED_DOMAINS:
            raise forms.ValidationError(
                u'You must register using an email address with a valid '
                'domain ({}). You can change your email address later on.'
                .format(', '.join(self.allowed_domains))
            )
        return submitted_data

从您正在使用的 django-registration 后端重新使用 django-registration ' urls.py并更改{{ 1}} url with

registration_register
上面的

url(r'^register/$', RegistrationView.as_view(form_class=EmailDomainFilterRegistrationForm), name='registration_register'), 取决于您正在使用的 django-registration 后端中的哪一个。不要从顶级RegistrationView导入它。使用以下语句中的 ONE 从适用的后端导入它:

views.py