2011-03-18 63 views
3
class CustomerProfile(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    gender = models.CharField(max_length=1,blank=True) 
    zip_code = models.IntegerField() 

class StoreProfile(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    phone_number = models.IntegerField() 

我希望能夠登錄/認證用戶作爲「商店」或「客戶」。定義兩個不同的擴展到用戶模型

  1. 有沒有辦法使這個工作與上述模型?

  2. 我也將看着@login_required修飾器區分登錄的商店和客戶。有關如何繼續的建議?

回答

2

我希望能夠作爲「商店」或「客戶」登錄/認證用戶。

有沒有一種方法,使上述模型這項工作?

是的,但是。

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

如果你想使用自動功能,你會得到與用戶關聯的一個(單)檔案類對象。

如果您不想使用自動配置文件功能,它將工作得很好。您將無法使用AUTH_PROFILE_MODULE設置或 一個Userget_profile()方法。你將被迫寫了很多的

try: 
    CustomerProfile.objects.get(user=request.user) 
except CustomerProfile.DoesNotExist: 
    # hmmm. Must be a Store, not a Customer. 

這不是太糟糕了,因爲它主要是將是一個泛型函數來獲取相關 輪廓「辛苦」。

我也將看看@login_required裝飾器來區分登錄的商店和客戶。有關如何繼續的建議?

  1. 添加save()方法其中每個檢查對象物體的存在類。如果您嘗試爲用戶創建CustomerProfile,則CustomerProfile.save()將檢查StoreProfile並在存在異常時引發異常。

    這兩種關係是排他性的。你需要在你的各種模型中保證這一點。

  2. 寫兩個裝飾器,你會更開心。它們有相當數量的重疊,但編寫許多簡單的無參數裝飾器比處理超級裝飾器更好。

    @customer_required@store_required。每個人都會執行@login_required所做的操作,並確定與用戶的關係具有記錄。 customer_required必須檢查與用戶的CustomerProfile關係。 store_required檢查與用戶的StoreProfile關係。


http://docs.djangoproject.com/en/1.2/topics/auth/#groups

在另一方面,你有內Django的定義組。我建議你使用組和組名,而不是嘗試擁有這樣的超級花式配置文件。

擁有一個具有所有屬性的「主」配置文件。

使用Django Group表來定義您的各種角色(「用戶」,「存儲」)並正確地爲用戶分配用戶。

然後檢查您的@store_required和@customer_required授權裝飾器中的組名。

+0

我不知道Django Groups,我會嘗試並實現它。謝謝:) – 2011-03-18 20:39:10

+0

我讀過關於創建用戶組的信息,我想我有一般的想法。例如,如果我有這兩條語句:'store_group = Group(name ='Store')''store_group.save()'。在我的Django項目中,我應該把它們包括在內? – 2011-03-18 21:39:43

+0

@Rami_H:在創建應用程序時,組會被植入您的數據庫中。有這樣做的固定裝置。或者你可以通過管理界面手動創建它們。 – 2011-03-19 02:40:38

2

AFAIK這是無法完成的。不過你可以試試這個:

class UserProfile(models.Model): 
    user = ForeignKey(User, unique=True) 
    store = OneToOneField(Store, blank=True, null=True) 
    customer = OneToOneField(Customer, blank=True, null=True) 

,並設置唯一的store一個或創建用戶配置文件時customer

+0

這很好。這可能會導致更多的數據庫訪問來驗證每個請求上的用戶。如果性能出現問題,則可以將Store和Customer屬性合併到單個UserProfile表中,並使用簡單的「標誌」屬性區分用戶。 – 2011-03-18 19:10:47

+0

我認爲這是一個非常有趣的方法。我很難區分'OneToOneField'和'ForeignKey'。你能解釋一下爲什麼你和商店和顧客一起爲用戶和OneToOneField選擇了ForeignKey嗎? – 2011-03-18 20:17:15

+1

我選擇ForeignKey是因爲我相信這是使用用戶配置文件的必要方式。我爲商店和客戶使用了OneToOneField,因爲最多隻能在商店或客戶中使用用戶個人資料。 – gruszczy 2011-03-18 20:23:44

0

你如何擴展新的外部表的用戶模式不必改變你如何處理這一點 - 所以這是好的。解決這個

一種方法是使用login_required邏輯,但在創建時,還可以指派在Django的認證權限的用戶 - 一個用於存儲和一個客戶。否則,您可以編寫一個實用程序函數,根據它們在外表中的存在情況來確定其成員資格。欲瞭解更多信息,請參閱http://docs.djangoproject.com/en/dev/topics/auth/