Django-registration如何检查用户是否存在

时间:2016-10-21 12:51:31

标签: python django django-class-based-views django-registration

我使用Django-registration与Django 1.8.15注册用户。我的urls.py看起来像这样:

from registration.backends.hmac.views import RegistrationView

url(r'^registration/register/$', RegistrationView.as_view(form_class=MyCustomSubscriberForm), name="registration_register"),

这基本上是我提供表格和模板的CBV。 这是以下形式:

class MyCustomSubscriberForm(RegistrationForm):

class Meta:
    model = MyCustomSubscriber
    fields = ('firstname', 'surname', 'email', ) 

我的问题是如何处理此CBV中的验证?

目前,例如有人尝试使用已经使用过的电子邮件地址注册Django提供IntegrityError at /registration/register/ ...

使用Validators from Django-registrations的最佳方式是什么?例如 - 如何确保具有某个电子邮件的用户已经存在,用户会在模板中收到通知?

如何使用Django-Registration提供的验证器扩展此CBV或在我的代码中处理此错误?

2 个答案:

答案 0 :(得分:2)

您需要验证表单中的clean_<field>方法中的电子邮件,如果它是您可以在模板中呈现的重复电子邮件,则会引发错误。

请从文档中查看此部分:Cleaning a specific field attribute

所以你可以得到类似下面的代码:

def clean_email(self):
    data = self.cleaned_data['email']
    duplicate_users = User.objects.filter(email=data)
    if self.instance.pk is not None:  # If you're editing an user, remove him from the duplicated results
        duplicate_users = duplicate_users.exclude(pk=self.instance.pk)
    if duplicate_users.exists():
        raise forms.ValidationError("E-mail is already registered!")
    return data

答案 1 :(得分:0)

在仔细研究Django-registration之后,我发现Django-registration已经以其中一种形式实现了这个功能:RegistrationFormUniqueEmail这是RegistrationForm的子类。

要使用它,我只需要在我的表单中将其子类化为:

class MyCustomSubscriberForm(RegistrationFormUniqueEmail):

    def __init__(self, *args, **kwargs):
        super (RegistrationFormUniqueEmail, self).__init__(*args, **kwargs)

   class Meta: 
      model = get_user_model()
      fields = ('firstname', 'lastname', 'email') 

就是这样 - 表单正在检查提供的电子邮件地址是否唯一。