2012-12-21 144 views
2

我正在使用自定義後端(subclassed django註冊的SimpleBackend)。 我重寫了register()方法,因爲我需要在註冊期間進行一些處理(例如,與外部服務進行通信)。Django註冊與自定義後端:如何返回錯誤信息註冊()

如果註冊失敗,我可以告訴註冊表單發生錯誤嗎?

這是否需要在表單驗證級別執行?

作爲另一個例子,在創建用戶時可能會發生數據庫錯誤。註冊如何優雅地失敗?

編輯:這是我的SimpleBackend的子類:

class MySimpleBackend(SimpleBackend): 
    def register(self, request, **kwargs): 
     username, email, password = kwargs['username'], kwargs['email'], kwargs['password1'] 

     # 
     # Make a call to some external API, for example 
     retval = api_call_to_somewhere() 
     if retval is False: 
      # Request failed: display some error message on registration form 
      return something 
      # OR 
      raise some_other 

     # Rest of code is the same as django-registration 

     User.objects.create_user(username, email, password) 

     # authenticate() always has to be called before login(), and 
     # will return the user we just created. 
     new_user = authenticate(username=username, password=password) 
     login(request, new_user) 
     signals.user_registered.send(sender=self.__class__, 
            user=new_user, 
            request=request) 
     return new_user 
+0

你可以分享一些代碼,以便我們可以幫幫忙好? – karthikr

+0

@karthikr我已經添加了一些代碼,以更好地顯示我在找什麼。 – jpimentel

+0

您需要提出一個驗證錯誤異常來實現此目的 – karthikr

回答

0

我結束了自定義Django的註冊的register認爲,從registration.views(不要混淆與SimpleBackend.register法)

原來的觀點稱backend.register()如果form.is_valid(),然後重定向到URL成功,則認爲用戶在backend.register()創建,不要再追任何異常。 添加我自己的代碼來捕獲異常,我可以在backend.register()上提出錯誤並將它們顯示給用戶,作爲表單錯誤。

下面是代碼,因爲它出現在django-registration\registration\views,在register功能的中間,我加了臺詞:

if request.method == 'POST': 
    form = form_class(data=request.POST, files=request.FILES) 
    if form.is_valid(): 
     try: # added this line 
      new_user = backend.register(request, **form.cleaned_data) 
      if success_url is None: 
       to, args, kwargs = backend.post_registration_redirect(request, new_user) 
       return redirect(to, *args, **kwargs) 
      else: 
       return redirect(success_url) 
     # added these 3 lines below 
     except Exception, err: 
      errors = form._errors.setdefault(NON_FIELD_ERRORS, ErrorList()) 
      errors.append(err) 
0

如果您正在覆蓋register方法,你需要照顧ErrorHandling中,ExceptionHandling的,顯示的信息給用戶,並內錄入自己register方法。

如果您擔心向用戶顯示錯誤信息,你可以看看django's messages framework這是因爲這樣做很容易:

def register(request): 
    try: 
     # Try something here 
    except Exception: 
     messages.error(request, "An Error Occured !") 

而且,正如你所談到的驗證,這是一件好事,有兩個客戶端(jquery/ajax)驗證和服務器端(django)驗證,以防止垃圾郵件發送者和badboys。

你也可能想看看進入logging module如果要通過服務器管理員登錄使用的錯誤,主持人等

+0

我已經添加了一些代碼給我的問題。這不是我擔心的驗證,而是以某種方式在註冊表單上顯示典型的驗證錯誤,但在「註冊」級別提出 – jpimentel