2009-05-22 46 views
11

默認的Django的User模型有一些字段和驗證規則,我並不真正需要。我想盡可能簡單地進行註冊,即需要電子郵件或用戶名或電話號碼 - 所有這些都是唯一的,因此用戶標識符很好。如何更改默認的django用戶模型以適合我的需求?

我也不喜歡在Django用戶模型中驗證的用戶名的默認字符集。我想允許任何角色 - 爲什麼不呢?

我之前使用用戶配置文件django應用程序向用戶添加配置文件 - 但是這一次我寧願讓這個類變得簡單。但我仍然希望使用User類,因爲它使我可以輕鬆地讓部分站點僅限用戶登錄。

我該怎麼做?

回答

8

與其直接修改用戶類或進行子類化,您也可以重新調整現有字段的用途。

對於一個站點,我使用「first_name」字段作爲用戶的「公開顯示的名稱」,並將「slugified」的版本填入「用戶名」字段(用於URL)。我寫了一個自定義auth後端,允許用戶使用他們的「公共名稱」或他們的電子郵件地址登錄,並且我在註冊時強制這兩個人的唯一性。這與其他可重用應用程序很好地搭配,並不會引入額外的表格或查詢。

對於另一個網站,我根本不想用戶名,只有唯一的電子郵件。爲了滿足Django對唯一用戶名的需求,我只是散列電子郵件地址,並將其用作用戶名(您必須對散列進行64位編碼以將其壓縮到30個字符以內)。自定義身份驗證後端允許使用電子郵件登錄。

如果向後兼容性不是問題,我希望看到對django.contrib.auth和User模型有很多改進,使它們更加靈活。但是,在目前的限制條件下,你可以用很少的創造力來做很多事情。

7

Django用戶模型的結構非常明智。例如,您真的不想允許用戶名中的任意字符,並且有方法可以實現email address login,而不會修改基本模型。

爲了簡單地存儲用戶帳戶的附加信息,Django支持用戶配置文件的概念。雖然你不需要依靠內置的支持來處理這個問題,但這是一種常見的慣例,它可以讓你在以太網中浮動的可重用Django應用程序中玩得很開心。有關更多信息,請參閱here

如果您想要真正修改核心用戶模型,並且可以使用可重複使用的應用程序「玩得開心」,那麼您就打開了一個潘多拉的盒子。開發人員對核心庫的結構做出基本假設,因此任何更改都可能導致意外中斷。但是,您可以修改基本模型的更改,或在本地分支Django的副本。我會勸阻後者,只有在你知道你在做什麼時才推薦前者。

+6

Django用戶模型的結構「合理」,因爲如果您正在構建網站,那麼對於特定的一組需求,這將是一個合理的用戶模型。但作爲框架的核心用戶抽象,它留下了一些需要的靈活性。 – 2009-05-22 15:12:14

+2

我同意一個更可插拔的認證系統將是可取的 – 2009-05-23 06:37:14

7

我誤解了這個問題。希望這篇文章對其他人有幫助。

#in models.py 
from django.db.models.signals import post_save 

class UserProfile(models.Model): 
    user = models.ForeignKey(User) 
    #other fields here 

    def __str__(self): 
      return "%s's profile" % self.user 

    def create_user_profile(sender, instance, created, **kwargs): 
     if created: 
      profile, created = UserProfile.objects.get_or_create(user=instance) 

post_save.connect(create_user_profile, sender=User) 

#in settings.py 
AUTH_PROFILE_MODULE = 'YOURAPP.UserProfile' 

這將創建一個用戶配置文件,如果每一個創建它的用戶保存時間。 然後,您可以使用

user.get_profile().whatever 

下面是從文檔

http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

0

你面對一個有點進退兩難這實際上有兩個解決方案,如果你致力於避免了曲線的一些更多的信息爲基礎的定製已經指出。

  1. 更改User模型本身,每丹尼爾的建議
  2. CustomUser類,繼承User或複製其功能。

後者建議意味着你將不得不實施一些事情,User自動手動做,但我不知道,因爲它的聲音,特別是如果你在你的項目一開始就知道是否是壞。你所要做的就是重寫一箇中間件類和一些裝飾器。

當然,我不認爲這會向您購買任何不會讓您獲得的東西,除非您的項目不應該因爲您的django svn update而中斷。它可以避免與其他應用程序的一些兼容性問題,但我的猜測是大多數問題都會以任何方式存在。

0

有很多方法可以做到這一點,但這是我會做的:我會允許用戶輸入電子郵件,用戶名(必須包含至少一個字母,不包含@符號)或手機號碼。然後,當我驗證它時:

  1. 檢查是否存在@。如果是這樣,請將其設置爲用戶的電子郵件,並對其進行適當的散列並將其設置爲用戶名。
  2. 檢查它是否只有數字,破折號和+。然後,去掉適當的字符並將其存儲爲手機號碼和用戶名(如果您將移動號碼存儲在另一個型號中以用於SMS目的)。
  3. 如果不是,請將其設爲用戶名。

我也會在登錄時驗證用戶/電話/電子郵件字段,並在相應位置查找,以便用戶註冊其手機號碼,然後更改其用戶名(對於其他用戶目的),他們仍然可以用他們的手機號碼登錄。

相關問題