我已经更改了这个
的应用标签class Model(models.Model):
pass
class Meta:
app_label = 'App Name'
db_table = 'app_table'
表和应用程序已经存在,问题是当我进入管理界面时,只有超级用户可以查看应用程序,而其他用户没有,我试图向其他用户添加权限但它没有出现在权限框。
提前致谢!
答案 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_label
,modelclass
是代理模型的小写名称。
答案 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标签下。 我不肯定这会修复权限问题,因为我现在没有环境来测试它,但它会显示在另一个其他标签下。