【问题标题】:app_label permission problem Djangoapp_label 权限问题 Django
【发布时间】:2011-06-25 16:18:46
【问题描述】:

我已经为此更改了应用标签

class Model(models.Model):
     pass

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

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

提前致谢!

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这可能对你有用:

    像往常一样定义你的模型类,即:

    class MyModel(models.Model):
         pass
    
         class Meta:
              db_table = 'app_table'
    

    然后创建一个代理模型,并更改该代理模型的应用标签,第二个模型如下所示:

    class MyProxyModel(MyModel):
         pass
    
         class Meta:
              proxy = True
              app_label = 'app_name'
    

    注意:您的 App 标签必须全部小写,并包含下划线而不是空格,Django 会自动替换下划线并将应用标签大写。

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

    admin.site.register(MyProxyModel,MyModelAdmin)
    

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

    【讨论】:

      【解决方案3】:

      app_label 影响数据库表名和内容类型条目。就好像您的模型将被移动到其他应用程序一样。权限取决于内容。 Syncdb 将修复内容类型,将创建新表,将创建新的权限条目。您需要为该模型上已“移动”到其他应用程序的现有用户/组添加权限。

      【讨论】:

      • 问题是权限不在管理面板的权限框中
      • 你更改app_label后是否运行了syncdb?
      • 也许您使用的是南方?如果是这种情况,您可能需要添加带有 --all 标志的 run syncdb。
      【解决方案4】:

      我不确定您是否使用了 app_label,因为它是这里的意图。如果您想提高模型名称的可读性,请在模型的元类中使用 verbose_name

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

      【讨论】:

      • 我需要将该表放在 Django Admin 的另一个应用程序组中。
      • 啊,我明白了。为假设道歉......我从来没有尝试过像这样操纵管理员列表。如果您提到的“应用程序名称”与您要将其移动到的应用程序组的模块名称相匹配,您可能需要直接破解权限和/或内容类型数据库表中的记录。但这不是我会轻易采取的方法。我会考虑先覆盖管理模板...
      猜你喜欢
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 2011-02-20
      • 2019-09-08
      • 2011-08-18
      • 1970-01-01
      • 2018-11-01
      相关资源
      最近更新 更多