2013-10-09 18 views
0

這裏是我的models.py:動態創建的代理型號沒有列在管理網站權限

class Item(models.Model): 
    # ... some irrelevent fields ... 
    tags = models.ManyToManyField('Tag') 

class Tag(models.Model): 
    name = models.CharField(max_lenght=30) 
    category_id = models.IntegerField() 

標籤實際上是一個通用名稱。每個項目都有許多不同類型的標籤 - 目前有四種類型:團隊標籤,主題標籤,管理標籤和特殊標籤。最終可能會有更多。

的想法是,他們都如此,而不必像4代表與多對多的關係,而是增加一個新列項目,只要增加一個新的類型基本相同的字段,一切被稱爲「標籤'並且在不改變模式的情況下添加新類型非常簡單。

我們在admin.py處理這個問題我使用dyamically創建的代理模型(基於this),因爲這樣的:

def create_modeladmin(modeladmin, model, name = None): 
    class Meta: 
     proxy = True 
     app_label = model._meta.app_label 

    attrs = {'__module__': '', 'Meta': Meta} 

    newmodel = type(name, (model,), attrs) 

    admin.site.register(newmodel, modeladmin) 
    return modeladmin 


class TagAdmin(models.Model): 
    def queryset(self): 
     return self.model.objects.filter(category_id = self.cid) 

class TeamAdmin(TagAdmin): 
    cid = 1 

class SubjectAdmin(TagAdmin): 
    cid = 2 
# ... and so on ... 

create_modeladmin(TeamAdmin, name='Teams', model=Tag) 
create_modeladmin(SubjectAdmin, name='Subject', model=Tag) 
#... and so on ... 

這對我的偉大工程。但是,不同的員工需要不同的編輯權限 - 一個人不應該訪問管理員標籤,而另一個人只能訪問編輯主題標籤和團隊標籤。但就管理網站而言 - 動態模型不存在於權限列表中,我無法給予任何人關於它們的權限。

即給出的列表中的所有權限,仍然無法訪問編輯任何動態模型的用戶,並讓任何人訪問他們所有的唯一方法就是給他一個超級用戶,這顯然違背了點

我搜索了SO和網頁,我也不能有任何人有類似的問題,並且文檔沒有對此提出任何說明,不在dynamic models sectionproxy models section。所以我猜這是一個不同的問題。任何幫助將不勝感激

UPDATE

因此,一些研究之後,答案很簡單。因爲django中的權限是保存到數據庫的對象,所以我需要做的很簡單 - 將相關權限(並創建新的ContentType對象)添加到數據庫,然後我可以爲人員提供特定的權限。

但是,這引發了一個新問題 - 將create_modeladmin中創建權限的函數作爲find_or_create類型的函數(基本上每次運行)或將其用作外部腳本每當我添加一個新的動態模型時,我應該運行一次(有點像syncdb這樣做)?

還有一種方法可以動態創建權限(這對我來說似乎是理想和最合適的解決方案)?

+0

另外,在看這個:http://blog.muhuk.com/2009/05/14/django-permission-system.html# .UmBEJ1CGqNo我開始考慮創建我自己的Permission對象,而不是創建指向它的動態代理模型。看起來像一個黑客,但可能是我在這裏尋找的方向 – yuvi

+0

類似於:http://stackoverflow.com/questions/8096980/user-permissions-on-proxy-models-in-modeladmin – fastmultiplication

+0

我做了一個腳本在這裏執行此操作:http:// stackoverflow。com/questions/5486018/django-how-to-make-modeladmin-class-show-up-in-available-permissions/20759563#20759563 – fastmultiplication

回答

-1

當然你可以創建權限,Django的有django.contrib.auth.management.create_permissions做到這一點