0

我使用Django-registration与Django 1.8.15注册用户。我urls.py看起来是这样的:Django注册如何检查用户是否存在

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的最佳方式?例如 - 我如何确保如果具有特定电子邮件的用户已经存在,用户会在模板中收到通知?

如何扩展此CBV或在我的代码中处理这个错误与Django注册已提供的验证器?

回答

0

寻找到Django的注册后,更仔细地我发现,Django-注册已经以其一种形式实现了该功能: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') 

,那就是它 - 形式检查,如果所提供的电子邮件地址是唯一的。

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 
+0

你需要处理的编辑模式;) '''QS = User.objects.filter(电子邮件=数据) 如果self.instance.id: QS = qs.exclude(ID = ID)''' – Mounir

+0

你绝对正确,我已经编辑了我的答案。但由于他有注册表格,他可能不会使用它进行编辑。 – ihhcarus

+0

感谢您的建议,这当然是可能的!当然,这是一个有效的答案,但也有可能使用内置的Django注册功能,正是这一点 - 正如我的答案中所述。 – user1544500