2012-09-26 86 views
1

我目前正在與Django合作,我必須爲用戶提供註冊和登錄的可用性。 我已經閱讀了許多文檔,並且每一個都推薦擴展用戶模型。 是否有限制擴展用戶模型? 我是否必須構建自己的應用程序或擴展用戶模型?是否重寫Django中的用戶模型?

+0

你只是希望讓用戶註冊和登錄? Django具有內置的表單和視圖:https://docs.djangoproject.com/en/dev/topics/auth/ – Tom

回答

1

如果您需要更多信息存儲在您的用戶模型中,請查看this answer

對於用戶註冊,有一個名爲​​的應用程序。

+0

我已經做到了,但我只是問有沒有限制或缺點: ) – billyJoe

1

django-registration的好處在於它在收集足夠的信息以註冊用戶(允許他們登錄到您的系統)和收集關於該用戶的其他信息Profile,例如性別,dob等 這個第二點可以用很多不同的方式完成,django-registration的作者James Bennet也創作了django-profiles這是一個單獨的應用程序,允許您靈活地構建必需的字段構成用戶配置文件。

如果你想推出你自己的配置文件解決方案,那麼我不會推薦實際擴展(在對象繼承意義上)的Django用戶模型,但簡單地指定一個額外的模型中的外鍵關係,將保存所有的個人資料字段,則可以從任何用戶實例跟隨與此配置文件模型的反向關係。

例如:

class Profile(models.Model): 
    user = models.ForeignKey(User) 
    nickname = models.CharField(max_length=255) 

>>> user = User.objects.create_user(username='a_user', email='[email protected]', password='password') 
>>> profile = Profile.objects.create(user=user, nickname='example') 
>>> user.profile_set.all()[0].nickname #follow the reverse relationship from the fk in Profile 
example 
0

這樣的回答變成了一個相當的敘述,所以這裏的短部分:

這個工作很適合我,但你需要的,如果你想要做額外工作用戶子類,而不是您的RequestContext實例上的auth.User。

TLDR

我已經在過去與用戶名中切換到基於電子郵件的登錄的目標,做到了這一點。這增加了一些開銷,因爲它還需要一個新的auth後端。另一方面,替換auth後端將導致RequestContext.user和HTTPRequest.user成爲自定義User子類的實例。

根據我的經驗,在使用contrib.admin時,擴展User的粘性部分來了。

訣竅是,當未經身份驗證/未經授權的用戶試圖訪問某個管理網址時,contrib.admin會使用其自己的登錄視圖。當我登錄到不同的登錄頁面時,這一點很明顯,但如果您還沒有覆蓋這些登錄頁面,則可能不那麼明顯。雖然這也使用了標準的auth後端,所以我的RequestContexts以auth.User實例而不是我的子類結束。

解決方案是重寫AdminSite並定義一個新的登錄方法。我只是重定向到了我的前端登錄頁面,登錄頁碼爲?next

而不是通過所有這些跳火圈,一個簡單的解決方法就是離開auth.User的上下文,並在你的用戶子類中定義一個類方法:

@classmethod 
def for_auth_user(cls, auth_user): 
    return cls.objects.get(user_ptr_id=auth_user.id) 

這只是一個額外的分貝相互撞擊頁面加載。您甚至可以在每個請求開始時編寫一箇中間件進行交換。