我已经改变了应用程序标签,这样做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