我有工作的解决方案,但我担心我的解决方案不是pythonic。所以我希望有人能提出更好的方法。
使用Django ver 1.8.2我使用的是django-registration-redux ver 1.2。我有自己的表格,因此我设置了REGISTRATION_FORM = 'login_app.forms.MyRegForm'
。
此外,我需要一项功能,以便只允许列入白名单的电子邮件。根据{{1}}注册视图由registration/backends/default/urls.py
中的RegistrationView
类处理:
registration/backends/default/views.py
可以在Github上查看 ...
from registration.backends.default.views import RegistrationView
...
url(r'^register/$',
RegistrationView.as_view(),
name='registration_register'),
...
课程。因为这个带有它功能的类提供了所需的功能,所以我将其子类化并复制了它的所有内容,只添加了几行代码。在我的RegistrationView
:
login_app.views.py
最后我覆盖了url,以便使用正确的视图:
from registration.backends.default.views import RegistrationView
# and many other imports to satisfy actions inside MyRegView
class MyRegView(RegistrationView):
# some copied code
def register(self, request, form):
# some copied code
WHITELISTED_EMAILS = getattr(settings, 'WHITELISTED_EMAILS')
email_to_check = form.cleaned_data['email']
if email_to_check in WHITELISTED_EMAILS:
# registration performed
# by using copied code
else:
raise PermissionDenied
def registration_allowed(self, request):
# remaining copied code
此解决方案工作正常,但我复制了太多代码。什么是白名单实现更优雅的解决方案?
答案 0 :(得分:2)
我认为最简单的解决方案是在您的注册表单中添加clean_email
方法,并在那里进行白名单。
class MyRegForm(ParentForm):
def clean_email(self):
email = self.cleaned_data['email']
# If the parent class already cleans the email, you might want to do
# email = super(MyRegForm, self).clean_email()
# Then check email here, and raise forms.ValidationError()
# if the email is not in the whitelist
return email