如何在组中创建django中的自定义组

时间:2016-07-14 13:41:14

标签: python django inheritance permissions usergroups

我正在试图弄清楚如何在Django中创建自定义组,以便组与应用程序相关而不是与项目相关。

例如,当用户想要创建公司时,它应该是公司的所有者:

模型

class Company(models.Model):
    owner = models.ForeignKey(User)
    name = models.CharField(max_length=64, unique=True)
    description = models.TextField(max_length=512)
    created_on = models.DateTimeField(auto_now_add=timezone.now)

    class Meta:
        permissions = (
            ("erp_view_company", "Can see the company information"),
            ("erp_edit_company", "Can edit the company information"),
            ("erp_delete_company", "Can delete the company"),
        )

视图

# Create your views here.
def register(request, template_name='erp/register.html'):
    if request.method == 'POST':
        company_form = CompanyRegistrationForm(request.POST)
        if company_form.is_valid():
            # Create a new company object but avoid saving it yet
            new_company = company_form.save(commit=False)
            # Set the owner
            if request.user.is_authenticated():
                new_company.owner = request.user

            # Add the user to group admin
            group = Group.objects.get_or_create(name="erp_admin")
            request.user.groups.add(group)

            # Save the User object
            new_company.save()

            template_name = 'erp/register_done.html'
            return render(request, template_name, {'new_company': new_company})

    else:
        company_form = CompanyRegistrationForm()

    return render(request, template_name, {'company_form': company_form})

这里有问题:

1)我没有 Group.objects.get_or_create(name="erp_admin") ,而是希望CompanyGroup.objects.get_or_create(name="admin")方式将应用程序的组限制在应用程序中。

2)如何将每个模型的Meta类中定义的权限映射到一个组?

3)自定义组与公司相关,这意味着每个公司都有组Admin,从所有者开始。所有者可以创建像“经理”这样的用户。管理员可以创建组/权限,添加用户,为用户设置权限,但无论如何CRUD管理员组。所以组中有一种层次结构(我认为层次结构取决于添加到组中的权限)。

为了使其更加清晰,您可以看到这个概念的图片: company example

所以我认为主要的问题是:

1)如何继承组以创建自定义组。

2)如何将模型的权限映射到组。

3)如何将组限制为CompanyID。

我希望问题得到明确定义。如果我必须澄清一些事情,请告诉我。

提前感谢您的支持。

编辑1)

对于第3点,我在SO Extend django Groups and Permissions上找到了这个答案,但问题是如何查询这些数据以及如何检查权限。你怎么能覆盖save()方法来将元信息添加到属性'name'?组名可能类似于:“company_id#admin”或“company_id#manager”。

1 个答案:

答案 0 :(得分:0)

您可能正在寻找Per对象权限。 Django不支持开箱即用,但可以使用应用Django-guardian