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是你的代理模型的小写名称。