扩展django组和权限

时间:2012-10-15 09:36:38

标签: django django-models django-permissions

我过去3天一直在搜索Google和Stackoverflow,但找不到任何类似内容。我想扩展或使用django组和权限。

假设我们有一些项目与不同的团队和用户。

class Project(models.Model):
    owner = models.ForeignKey(User)
    name = models.CharField(max_length=100)

class Team(models.Model):
    project = models.ForeignKey(Project)
    members = models.ManyToManyField(User)
    name = models.CharField(max_length=100)
    permission = models.ManyToManyField(Permission)

现在 - 一切都很好。现在我想要的是扩展django提供的现有Auth.Group,以便我可以直接使用request.user.has_perm...

所以,让我们将 Team-Model 更改为

class Team(Group):
    project = models.ForeignKey(Project)
    members = models.ManyToManyField(User)

这扩展了现有的集团。 namepermissions字段直接来自 Group-Model 。如果我创建了一个新的团队,那么也会添加。那很棒。

使用自定义save方法,我还可以添加user中列出的members,将添加到已创建的并获取权限授予团队/团队

现在我的问题是,群组name字段是唯一的 - 因此我无法为每个项目添加管理员 - 团队。< / p>

我考虑为前端添加另一个名称字段,并为 Group-Model 的名称字段生成唯一字符串。但是嗯....对于多个自定义组有更好的解决方案吗?也许有人有个主意?提前谢谢!

1 个答案:

答案 0 :(得分:3)

您需要使组名称唯一。因此,您发现的一种方法是使用另一个名称字段,使其对所有子组都是唯一的。

另一种方法是利用现有的名字字段并添加你的特殊字符。例如,使用admin#project1members#project1等的组名称。(注意:我不确定组名中是否允许'#',您可以选择允许的任何特殊字符。)

因此,每当您创建Team时,都会在#<project_name>模型Team方法中使用后缀save()更新名称字段。

要更加明智地显示它,您可以添加__unicode__()方法以仅返回组名的第一部分。例如:

class Team(Group):
    ...
    def __unicode__(self):
        try:
            return self.name.split('#')[0]
        except:
            #something wrong!
            return self.name