我正在尝试为我项目的注册表单设置一个电子邮件域名白名单。
我正在使用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
答案 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