2010-08-23 114 views
18

好吧,對於每個使用Django並經常被新手們問到的人來說,這一點非常明顯,但我想澄清一下,並討論是否有其他方法可以做到這一點。最廣泛和最方便的方法現在是存儲電子郵件的用戶名字段的Django 1.2允許「@」,「_」和「 - 」字符,但這種方式有以下問題:在Django中用電子郵件作爲用戶名

  1. 最糟糕的一個:用戶名場受到max_length=30財產的限制,這對於電子郵件而言可笑的很小。即使您覆蓋表單驗證,除非您手動更改表格,否則DB將擁有varchar(30)而不是EmailFieldvarchar(75)
  2. 您需要在用戶名和電子郵件字段中存儲您的電子郵件數據,以使User.email_user()正常工作。我認爲還有一些其他地方使用User.email時。
  3. 代碼可讀性失敗。當然,其他djangonauts知道這個陷阱,但是將字段名爲'用戶名'(特別是當仍然存在電子郵件字段時)作爲電子郵件顯然會使您的代碼變得不那麼容易理解。

另一種方法可以是使用email場將它傳遞給你的身份驗證後端像這樣的認證,但它仍然有問題:

authenticate(self, email=None, password=None) 
  1. User.email沒有unique=True屬性,這意味着你的數據庫不會有索引,通過電子郵件查找速度就像地獄一樣慢。
  2. 您必須處理username字段,該字段有unique=True,方法是將其從表中完全刪除或將其更改爲允許NULL和刪除索引。

恢復,這兩種方式都是邪惡的,需要在syncdb之後執行特定於DB的代碼,如果您需要與DB無關的應用程序,這是不可接受的。

+0

很酷的問題,我想知道如何在Django中使用電子郵件作爲用戶名;-) – gruszczy 2010-08-23 11:23:14

回答

5

我已經打包了django-email-as-username,如果你想刪除用戶名並只使用電子郵件,它應該可以滿足你所需的一切。

的簡要概述爲:

  1. 提供電子郵件身份驗證的後端和輔助功能,如創建用戶。
  2. 修補Django管理員以處理基於電子郵件的用戶身份驗證。
  3. 覆蓋createsuperuser命令以僅使用電子郵件創建用戶。
  4. 將郵件驗證視爲不區分大小寫。

引擎蓋下的用戶名被散列的電子郵件,這最終意味着我們不侷限於Django的用戶名30個字符限制的版本(只是普通電子郵件75字符限制。)

編輯 :從Django 1.5開始,您應該考慮使用自定義用戶模型而不是'django-email-as-username'軟件包。

0

嗯,我沒有必要在Django中使用電子郵件作爲用戶名,但我想你可以創建一個UserProfile模型並將字段聚合到它,就像另一個電子郵件字段並使其唯一。所以你可以做user.get_profile()。email來驗證你的身份。

我想另一種方式去繼承用戶並重新定義字段,但我認爲這仍然不被Django開發人員推薦。

最後,您可以定義您自己的自定義用戶模型,並返回django.contrib.auth.models.User以獲取某些邏輯。

代碼來改變用戶表內的Django:

from django.db import connection 
cursor = connection.cursor() 
cursor.execute("ALTER TABLE auth_user MODIFY COLUMN username varchar(75) NOT NULL") 
+0

多表繼承或修改auth應用程序的本地副本的壞處是,沒有辦法來定義什麼模型應該其他的貢獻應用程序,如管理員,消息或評論使用。 – 2010-08-23 12:54:12

+0

我明白了。我猜如果你不想遵循選項1,那麼向UserProfile添加一個新字段是最好的方法。不確定,如果此刻有任何其他方法。 – maraujop 2010-08-23 16:38:26

+0

如果您希望更獨立於數據庫,您可以做的另一件事是添加此代碼(編輯回答),在settings.py中添加一個變量以指示它是應該執行還是已經被修改。 – maraujop 2010-08-23 16:43:53

5

大衛·克拉默想出了一個解決這個問題,我的愛。我目前正在生產站點上使用它,用戶必須能夠使用他們的電子郵件或用戶名登錄。你可以在這裏找到它:

Logging In With Email Addresses in Django

如果在表格上提供的登錄名是電子郵件(包含「@」符號),它會嘗試與驗證,並求助於用戶名如果它不是電子郵件。 (當然,您只需確保您的註冊表格爲此作品捕獲一封電子郵件。)

相關問題