簡體   English   中英

在Django 1.5 / 1.6中設置兩種不同類型的用戶

[英]Setting up two different types of Users in Django 1.5/1.6

請注意 - 這是關於此主題的原始問題的更新版本,但值得再次詢問Django如何處理用戶和身份驗證。

我正在一個有兩種不同用戶的網站上工作 - 讓我們稱之為CustomersStore Owners 兩者都在網站上注冊,但功能卻截然不同。 Customers只需擁有一個個人資料,就可以在他們喜歡的商店中購物。 Store Owners擁有一個帳戶,但可以訪問多個商店,每個商店可以擁有多個Store Owners

模型的確切細節無關緊要,但這兩類用戶需要非常不同的字段。 理想情況下,模型看起來像這樣:

Customer
  email (username)
  password
  name
  address
  time_zone
  preferred_shipping
  favorite_stores (many-to-many field)
  ...

Store Owner
  email (username)
  password
  name
  balance
  stores_owned (many-to-many field on Stores)
  stores_managed (many-to-many field on Stores)
  ...

最初,當Django的自定義用戶支持不佳時,我有一個UserProfile類,其中包含一些附加字段,其中包含OneToOne on User ,然后是另一個CustomerStoreOwner類,它們是UserProfile上的OneToOne 這不是很好。

鑒於Django 1.5 / 1.6的變化,我試圖想出最好的結構方法。 現在,我有以下內容:

class CustomerUser(AbstractBaseUser):
    ...

class StoreOwnerUser(AbstractBaseUser):
    ...

但是因為有兩種類型的用戶,我不能將AUTH_USER_MODEL設置為只有其中一種。

構造這個的最佳方法是什么,以便我可以有兩個不同類型的用戶使用不同的字段,而不會在用戶身份驗證,用戶創建或管理員方面造成任何問題?

此外,我如何能夠從登錄單獨判斷此用戶是CustomerUser還是StoreOwnerUser

您的用戶類型似乎有一些常見功能和不常見的功能。 如果您的用戶類型中存在Django的默認用戶模型不支持開箱即用的常見功能,則應直接對其進行子類化。

為用戶類型添加額外的,不常見的功能最好不要通過子類化,而是使用配置文件。 我的理由是因為您對這些用戶類型的身份驗證沒有根本改變,但有關用戶的詳細信息取決於用戶的類型。 為了適應這種情況,您可以創建一個包含這些詳細信息的單獨模型,並將您的User類引用為OneToOne / ForeignKey關系(取決於您的設計)。

您可以對用戶創建過程進行修改,以確定應該是哪種用戶類型,並將其關聯的OneToOneField / ForeignKey(取決於您的設計)設置為適當的客戶類型模型。

通過這種方式,您應該只有一個AUTH_USER_MODEL,並且您應該能夠處理不同客戶類型的詳細信息。

構造這個的最佳方法是什么,以便我可以有兩個不同類型的用戶使用不同的字段,而不會在用戶身份驗證,用戶創建或管理員方面造成任何問題?

實際上你只有一種類型的用戶。 只是某些用戶設置了特定屬性而其他用戶沒有。 考慮一下django有“用戶”和“管理員”。 它們是同一模型的實例,但具有不同的屬性和權限。

你應該同樣接近它。 為整個應用程序提供一個用戶模型。 您可以在自定義用戶類中設置屬性/方法,以標識此用戶設置的標志(這將決定用戶的“類型”)。

此外,我如何能夠從登錄單獨判斷此用戶是CustomerUser還是StoreOwnerUser

您可以使用user_passes_test裝飾器,它接受一個函數名稱的參數,並且只有在函數返回真值時才處理視圖。

  1. 創建一個擴展Django的抽象基礎用戶的BaseUser
  2. 創建兩個名為CustomerUser和StoreOwnerUser的子類,它們擴展了BaseUser

     from django.db import models from django.contrib.auth.models import AbstractUser class BaseUser(AbstractUser): # all the common fields go here, for example: email = models.EmailField(max_length=10,unique=True) name = models.CharField(max_length=120) class StoreOwnerUser(BaseUser): # All Store Owner specific attribute goes here balance = models.some_balance_field() stores_owned = models.some_stores_owned_field() class Meta: verbose_name = 'Store Owner' class CustomerUser(BaseUser): # All Customer specific attribute goes here customer_id = models.CharField(max_length=30, unique=True) address = models.some_address time_zone = models.something... ... class Meta: verbose_name = 'Customer' 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM