2012-09-20 19 views
0

我使用django並具有電子郵件驗證功能,因此當有人驗證電子郵件時,我通過設置狀態來激活他/她的帳戶。如果某人將其他人的電子郵件地址,那麼他將無法驗證,並將無法登錄。所以我期待django在登錄時也查看用戶的狀態,因爲此狀態字段位於django auth應用程序的表中。在登錄時,django嘗試僅使用用戶名參數進行登錄。所以在登錄時說:在django登錄中需要不同的查找參數

MultipleObjectsReturned at /accounts/login/ 
get() returned more than one User -- it returned 2! Lookup parameters were {'username': u'[email protected]'} 

有沒有一種方法可以在查找中添加狀態字段?有沒有在這方面的配置或我需要爲此編寫某種登錄後端?或者我應該以不同的方式爲登錄表編寫自己的視圖?什麼是推薦的方式?此外,我想讓用戶使用電子郵件或用戶名字段中的用戶名登錄。那麼推薦的方式是什麼?

+2

讓兩個用戶創建具有相同電子郵件地址的帳戶,即使第一個用戶未被確認,也是一個壞主意。如果這兩個賬戶最終被確認呢? –

+0

@DavidRobinson的電子郵件地址將是一個人,那麼如何確認一旦一個人會確認,然後其他人將無法確認,即使 – Hafiz

回答

1

您需要編寫一個適合您需求的身份驗證後端。檢查出django documentation

基本上,您需要編寫一個「驗證」方法,它將在過濾器參數中使用「狀態」。對於使用電子郵件或用戶名,您基本上可以過濾一個字段(用戶名或電子郵件),如果沒有用戶對象返回該字段,則在另一個字段上過濾。或者,您可以通過對這些字段進行「或」操作,將用戶置於單個過濾器中下面是一個僞代碼:

from django.contrib.auth.backends import ModelBackend 
from django.contrib.auth.models import User 

class AuthenticationBackend(ModelBackend): 
    def authenticate(self, username=None, password=None): 
     try: 
      user = User.objects.get(email=username, status=True) 
     except User.DoesNotExist: 
      try: 
       user = User.objects.get(username=username, status=True) 
      except User.DoesNotExist: 
       return None 
     # check password too 
     if user.check_password(password): 
      return user 
     return None 

注意,當你寫新的認證後端,你需要將它添加到AUTHENTICATION_BACKENDS參數在你的settings.py爲使用它。如果您不需要Django提供的默認Django提供的默認值,那麼只需重寫該參數即可,無需添加到元組中。

+0

將後端覆蓋默認後端,我的看法將自動使用此後端或我需要寫我自己的視圖代碼也獲得這個被稱爲? – Hafiz

+0

我需要放置這個後端以及如何調用它? – Hafiz

相關問題