我已經改變了應用程序標籤,這樣做app_label權限問題的Django
class Model(models.Model):
pass
class Meta:
app_label = 'App Name'
db_table = 'app_table'
表和應用已經存在,問題是,當我進入管理界面,只有超級用戶可以查看應用程序,和其他用戶沒有,我試圖給其他用戶添加權限,但它沒有出現在權限框中。
在此先感謝!
我已經改變了應用程序標籤,這樣做app_label權限問題的Django
class Model(models.Model):
pass
class Meta:
app_label = 'App Name'
db_table = 'app_table'
表和應用已經存在,問題是,當我進入管理界面,只有超級用戶可以查看應用程序,和其他用戶沒有,我試圖給其他用戶添加權限,但它沒有出現在權限框中。
在此先感謝!
我不確定你在使用app_label,因爲它是在這裏。如果您試圖提高模型名稱的可讀性,請在模型元類中使用verbose_name。
app_label似乎沒有最好的文檔,但從我可以告訴它應該是一個機器可讀的名稱。
app_label
影響數據庫表名和contenttype條目。彷彿你的模型將被移動到其他應用程序。權限取決於contenttpyes。 Syncdb將修復內容類型,將創建新的表格,將創建新的權限條目。您需要爲已移動到其他應用程序的該模型上的現有用戶/組添加權限。
這可能會爲你工作:
定義模型類作爲您通常會,即:
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顯示在管理界面的不同應用程序標籤下。 我不積極,這將解決權限問題,因爲我現在沒有環境來測試它,但它會顯示在其他標籤下。
這絕對是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_label
和modelclass
是你的代理模型的小寫名稱。
此Django票據與您的問題(和我的回答)相關,您可能想查看它:http://code.djangoproject.com/ticket/11154 – 2011-02-14 18:10:37