2010-01-24 87 views

回答

3

你無法輕鬆地在django.contrib.auth.model.User的用戶名字段中存儲電子郵件,因此您需要一個不同的auth後端。將以下內容添加到AUTHENTICATION_BACKENDS。見http://docs.djangoproject.com/en/dev/topics/auth/#writing-an-authentication-backend

from django.contrib.auth.models import User 

class EmailBackend(object): 
    """ Authenticates against the email field of django.contrib.auth.models.User 
    """ 

    def authenticate(self, email=None, password=None): 
     # Try using the email if it is given 
     if email: 
      for user in User.objects.filter(email=email): 
       if user.check_password(password): 
        return user 

    def get_user(self, user_id): 
     try: 
      return User.objects.get(pk=user_id) 
     except User.DoesNotExist: 
      return None 

然後,在你的意見,通過調用django.contrib.auth.authenticate認證。

有兩點需要注意:

  • 你可能會想保持默認AUTHENTICATION_BACKEND那裏,特別是如果你想使用Django管理。
  • 如果用戶在沒有用戶名的情況下對自己進行簽名,則需要爲他們創建一個。我用一個UUID的版本的base64爲

的保存方法設置的用戶名某處(例如,在您的新用戶表單):

import uuid, binascii 
username = binascii.b2a_base64(uuid.uuid4().bytes) 
+0

+1「你不能輕鬆存儲電子郵件」。 User.username字段a)只有30個字符,對於某些電子郵件來說不夠長,並且b)它要求名稱與'\ w +'匹配,這不允許諸如'@'或'。'之類的內容。如果你只想專注於電子郵件地址,這確實會造成使用者名稱(因爲它是必需的)的問題。我建議使電子郵件變得流暢(例如[email protected] => foo_bar_com),修剪爲30個字符並存儲(但要準備處理意外的碰撞)。用戶永遠不會看到它,並且您的身份驗證後端將完全忽略它。 – 2010-01-24 18:20:53

+0

在1.2中,您可以使用電子郵件登錄 – yanchenko 2010-03-31 04:00:36

+0

更多內容:1.2現在允許電子郵件中的字符用於用戶名(請參閱http://code.djangoproject.com/changeset/12634)。正如提交信息所承認的那樣,它不是一個完整的解決方案,因爲最大長度仍然只有30個字符。 – 2010-04-01 05:35:52

相關問題