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