动态创建的代理模型在管理站点上没有列出的权限

时间:2013-10-09 13:43:38

标签: django dynamic proxy django-admin

这是我的models.py:

class Item(models.Model):
    # ... some irrelevent fields ...
    tags = models.ManyToManyField('Tag')

class Tag(models.Model):
    name = models.CharField(max_lenght=30)
    category_id = models.IntegerField()

标签实际上是一个通用名称。每个项目都有许多不同类型的标签 - 目前有四种类型:团队标签,主题标签,管理标签和特殊标签。最终可能会有更多。

这个想法是,它们都有基本相同的字段,所以不是像4个表有很多关系,而是在添加新类型时为Item添加新列,所有是称为“标记”,在不对模式进行任何更改的情况下添加新类型非常容易。

现在在admin.py中处理这个问题我正在使用动态创建的代理模型(基于this),如下所示:

def create_modeladmin(modeladmin, model, name = None):
    class  Meta:
        proxy = True
        app_label = model._meta.app_label

    attrs = {'__module__': '', 'Meta': Meta}

    newmodel = type(name, (model,), attrs)

    admin.site.register(newmodel, modeladmin)
    return modeladmin


class TagAdmin(models.Model):
    def queryset(self):
        return self.model.objects.filter(category_id = self.cid)

class TeamAdmin(TagAdmin):
    cid = 1

class SubjectAdmin(TagAdmin):
    cid = 2
# ... and so on ...

create_modeladmin(TeamAdmin, name='Teams', model=Tag)
create_modeladmin(SubjectAdmin, name='Subject', model=Tag)
#... and so on ...

这对我很有用。但是,不同的工作人员需要不同的编辑权限 - 一个人不应该访问管理员标签,而另一个人只能访问编辑主题标签和团队标签。但就管理网站而言 - 动态模型在权限列表中不存在,我无法授予任何人关于它们的权限。

即。给予列表上所有权限的用户仍然无权编辑任何动态模型,而让任何人访问它们的唯一方法就是给他一个显然无视点的超级用户

我搜索了SO和网络,但我不能解决任何类似问题的人,并且文档没有在dynamic models sectionproxy models section中对此进行任何说明。所以我猜这是一个不同的问题。任何帮助将不胜感激

更新

因此经过一些研究后,答案很简单。由于django中的权限是保存到数据库的对象,我需要做的很简单 - 将相关权限(以及创建新的ContentType对象)添加到数据库,然后我可以为人们提供特定的权限。

然而,这提出了一个新问题 - 将创建权限的函数放在create_modeladmin中作为find_or_create类函数(基本上每次运行)或者它应该用作外部脚本是一个很好的约定每次我添加一个新的动态模型时应该运行一次(有点像syncdb的做法)?

有没有办法动态创建权限(在我看来,这似乎是理想和最合适的解决方案)?

1 个答案:

答案 0 :(得分:-1)

当然你可以创建权限,django有django.contrib.auth.management.create_permissions来做这个