app_label权限问题Django

时间:2011-02-11 16:22:15

标签: python django django-models django-admin django-permissions

我已经更改了这个

的应用标签
class Model(models.Model):
     pass

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

表和应用程序已经存在,问题是当我进入管理界面时,只有超级用户可以查看应用程序,而其他用户没有,我试图向其他用户添加权限但它没有出现在权限框。

提前致谢!

4 个答案:

答案 0 :(得分:2)

这绝对是Django中的一个错误。权限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是代理模型的小写名称。

答案 1 :(得分:0)

我不确定你是否正在使用app_label。如果您正在尝试提高模型名称的可读性,请在模型的元类中使用verbose_name

app_label似乎没有最好的文档,但据我所知,它应该是一个机器可读的名称。

答案 2 :(得分:0)

app_label会影响数据库表名和contenttype条目。好像你的模型将被转移到其他应用程序。权限取决于contenttpyes。 Syncdb将修复contenttypes,将创建新表,将创建新的权限条目。您需要向该模型上的现有用户/组添加权限,该模型已“移动”到其他应用程序。

答案 3 :(得分:0)

这可能对您有用:

按照惯例定义您的Model类,即:

class MyModel(models.Model):
     pass

     class Meta:
          db_table = 'app_table'

然后创建一个代理模型,并为第二个模型更改该代理模型的App Label,如下所示:

class MyProxyModel(MyModel):
     pass

     class Meta:
          proxy = True
          app_label = 'app_name'

注意:您的App标签应全部为小写,并且包含下划线的空格,Django将替换下划线并自动将应用程序标签大写。

然后为您创建的任何ModelAdmin注册代理模型。

admin.site.register(MyProxyModel,MyModelAdmin)

这应该让您的MyModelAdmin显示在管理界面中的不同App标签下。 我不肯定这会修复权限问题,因为我现在没有环境来测试它,但它会显示在另一个其他标签下。