2

我已經改變了應用程序標籤,這樣做app_label權限問題的Django

class Model(models.Model): 
    pass 

    class Meta: 
      app_label = 'App Name' 
      db_table = 'app_table' 

表和應用已經存在,問題是,當我進入管理界面,只有超級用戶可以查看應用程序,和其他用戶沒有,我試圖給其他用戶添加權限,但它沒有出現在權限框中。

在此先感謝!

+0

此Django票據與您的問題(和我的回答)相關,您可能想查看它:http://code.djangoproject.com/ticket/11154 – 2011-02-14 18:10:37

回答

0

我不確定你在使用app_label,因爲它是在這裏。如果您試圖提高模型名稱的可讀性,請在模型元類中使用verbose_name

app_label似乎沒有最好的文檔,但從我可以告訴它應該是一個機器可讀的名稱。

+0

我需要將該表格放入Django中的另一個應用程序組管理員。 – eos87 2011-02-11 17:00:48

+0

啊,我明白了。道歉的假設...我從來沒有試圖操縱管理員列表很像這樣。如果您提到的「應用程序名稱」與您希望將其移至的應用程序組的模塊名稱相匹配,則可能需要直接在權限和/或內容類型數據庫表中進行記錄破解。但這不是我輕視的方法。我會考慮首先覆蓋管理模板... – meshantz 2011-02-11 17:09:50

0

app_label影響數據庫表名和contenttype條目。彷彿你的模型將被移動到其他應用程序。權限取決於contenttpyes。 Syncdb將修復內容類型,將創建新的表格,將創建新的權限條目。您需要爲已移動到其他應用程序的該模型上的現有用戶/組添加權限。

0

這可能會爲你工作:

定義模型類作爲您通常會,即:

class MyModel(models.Model): 
    pass 

    class Meta: 
      db_table = 'app_table' 

然後創建一個代理模型,並更改代理模式的應用程序標籤,對於第二個模型,它看起來像:

class MyProxyModel(MyModel): 
    pass 

    class Meta: 
      proxy = True 
      app_label = 'app_name' 

注意:您的應用程序標籤應全部小寫,幷包含下劃線的空格INSEAD,Django會取代下劃線並利用該應用程序自動標籤。

然後爲代理模型註冊您創建的任何ModelAdmin。

admin.site.register(MyProxyModel,MyModelAdmin) 

這應該讓您的MyModelAdmin顯示在管理界面的不同應用程序標籤下。 我不積極,這將解決權限問題,因爲我現在沒有環境來測試它,但它會顯示在其他標籤下。

2

這絕對是Django中的一個bug。權限app_label和contenttype app_label之間存在衝突,導致權限從不匹配管理員。作爲一種變通方法,直到這個是固定的,你可以簡單地明確授予的權限ModelAdmin

class MyModelAdmin(admin.ModelAdmin): 
    ... 
    def has_add_permission(self, request): 
     return request.user.has_perm('app_label.add_modelclass') 

    def has_change_permission(self, request, obj=None): 
     return request.user.has_perm('app_label.change_modelclass') 

    def has_delete_permission(self, request, obj=None): 
     return request.user.has_perm('app_label.delete_modelclass') 

哪裏app_label是根模型app_labelmodelclass是你的代理模型的小寫名稱。