2012-01-25 107 views
7

我希望在我的Django項目中擁有更細化的權限,但無法決定使用哪個應用程序。 我所擁有的是一樣的東西:Django權限

class Item(models.Model): 
    name = models.CharField(max_length=64, unique=True) 
    description = models.CharField(max_length=128, default='') 
    logo = ImageField(upload_to=/tmp, blank=True, null=True) 
Django的標準權限

現在我有可能添加,更改之間並選擇刪除,我想有是一個擴展的更改權限,提供給能力例如,組權限只能更改徽標,但不允許同一組修改項目描述。我不希望或不需要用戶輸入關係,但是可以讓不同的團隊使用標準管理界面編輯模型的單個字段。我甚至不確定我是否在討論每個對象的權限?

有誰知道最好使用什麼或我將如何自己實現它?我也可以想象只有只讀用戶可以訪問/讀取所有內容,但無法修改,這也是不可能的。

感謝您的任何幫助。

+0

不,這些不是對象級權限。簡短的回答:可能是可行的,但它有很多代碼。長答案:你不能做你在香草django管理員描述的。一種方法是將單獨的ModelAdmins與啓用的相關字段掛鉤以分隔AdminSite實例。我認爲您可能必須繼承AdminSite以檢查您的組,並對每個組的權限進行硬編碼--django的內置權限沒有允許/禁止域的概念。 – AdamKG

+0

非常感謝您的期望答案和確認。我期待着實現單獨的AdminSite子類來完成我的任務。 – tinti

回答

7

最靈活的,但方法是:

  1. 寫一些custom permissions(即can_modify_descr
  2. 寫尤爾自己FormsModelForms
  3. 寫意見渲染你指定的形式。
  4. 終於,你必須override some django admin templates並在extend some standard django admin templates模板中呈現你的表單。

據我所見,這是實現你想要的,但也需要很多工作的唯一方法。

+0

謝謝,你也可以通過AdamKG描述的方式來做到這一點。這種方式更容易,因爲您沒有自定義視圖和相應的模板。 – tinti

1

實現該目的的一個簡單方法是爲同一模型(每個「組」)創建許多ModelAdmin。要做到這一點,你需要爲每個 「組」 這樣一個創造Proxy Models

models.py

class Item(models.Model): 
    name = models.CharField(max_length=64, unique=True) 
    description = models.CharField(max_length=128, default='') 
    logo = ImageField(upload_to=/tmp, blank=True, null=True) 

class ItemGroup1(Item): 
    class Meta: 
     proxy = True 

admin.py

class ItemAdmin(models.ModelAdmin): 
    ... 

class ItemGroup1Admin(models.ModelAdmin): 
    readonly_fields = ('logo', 'description') 

然後你只需要設置組1的權限只能訪問ItemGroup1等。

看到這篇文章的更多信息:Using Proxy Models to Customize the Django Admin

0

如果你想處理這種事情超出你的管理網站,看看django-logical-rules,你可以在Python中編寫規則,並從視圖或模板中訪問它們;