Django-allauth如何限制用户注册只能使用指定的电子邮件列表?

4

我正在使用Django-allauth,我有一组电子邮件列表,并希望将注册限制在此列表中。我的想法是检查注册用户的电子邮件,如果不在电子邮件列表中,则停止注册流程并进行重定向。 根据Chetan Ganji的建议,我尝试编辑allauth.account.views.SignupView,但它没有订阅form_valid方法。我该如何做?感谢您的帮助。

from allauth.account.views import SignupView

class AllauthCustomSignupView(SignupView):

    def form_valid(self, form):
        email = form.cleaned_data['email']
        auth_user_list =    [   'email_1',
                                'email_2',
                                ...
                            ]

        if not any(email in s for s in auth_user_list):
            return reverse('url')
        return super(MySignupView, self).form_valid(form)

你可能需要在allauth.account.views.SignupView中覆盖一些函数,因为在上面的代码中,你正在覆盖一些在用户成功注册后发送/调用的信号。 - RyuCoder
你需要在上述类中重写form_valid()方法,在调用其超级方法之前将上述登录代码放入此方法中。 - RyuCoder
谢谢,我正在遵循您的建议。我已经编辑了代码,但仍然无法正常工作。我做错了什么? - MtSorre
我还编写了一个新的URL,以便视图指向: url(r'^signup/$', AllauthCustomSignupView.as_view(), name="account_signup"), - MtSorre
2个回答

6
您可以通过扩展 DefaultAccountAdapter 类来实现。您需要想出一种方法来按需存储和提取受限列表。然后,您可以使用适配器并在注册表单中引发验证错误。扩展 DefaultAccountAdapter 并覆盖clean_email方法。在您的项目目录中创建一个adapter.py文件,并扩展默认适配器类。
from allauth.account.adapter import DefaultAccountAdapter
from django.forms import ValidationError

class RestrictEmailAdapter(DefaultAccountAdapter):

    def clean_email(self,email):
        RestrictedList = ['Your restricted list goes here.']
        if email in RestrictedList
            raise ValidationError('You are restricted from registering. Please contact admin.')
        return email

最后,将settings.py中的账户适配器指向你的扩展类。
ACCOUNT_ADAPTER = 'YourProject.adapter.RestrictEmailAdapter'

1
我的解决方案可行。但是,这个似乎更简单的解决方案。 - RyuCoder
1
他可以在RestrictEmailAdapter类上编写一个方法,使用Django ORM从数据库中返回受限电子邮件列表。他必须从clean_email()函数中调用该方法。 - RyuCoder
1
你说得对,两种解决方案都可以。我认为这个更简洁。非常感谢你们俩! - MtSorre

0

也许可以试试这段代码

class AllauthCustomSignupView(SignupView):

    def form_valid(self, form):
        email = form.cleaned_data['email']
        auth_user_list =    [   'email_1',
                                'email_2',
                                ...
                            ]

        if email in auth_user_list:
            return reverse('blocked-email') # whatever url, make sure that the url is defined inside form_valid or in approriate location.
        else:
            return super(AllauthCustomSignupView, self).form_valid(form)

class BlockedEmailView(TemplateView):
    template_name = "blocked-email.html"

在你的urls.py文件中加入以下代码:

url(r'^signup/$', views.AllauthCustomSignupView.as_view(), name="signup"),
url(r'^blocked/email$', views.BlockedEmailView.as_view(), name="blocked-email"),

此外,您需要更改SignupView表单的操作属性。因此,您将需要覆盖该视图的模板,保持其他所有内容不变,只需将操作更改为指向“signup/”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接