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

问题描述 投票:0回答:2

我正在尝试弄清楚如何在 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)自定义组与公司相关,这意味着每个公司都有一个以所有者开头的组管理员。所有者可以创建“管理员”等用户。管理员可以创建组/权限、添加用户、为用户设置权限,但不能以任何方式 CRUD 管理组。因此,组中有一种层次结构(我认为层次结构取决于添加到组中的权限)。

为了更清楚地说明这一点,您可以查看概念图片:

所以我认为主要问题是:

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

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

3) 如何将组限制为 CompanyID。

我希望问题得到很好的定义。如果我需要澄清一些事情,请告诉我。

预先感谢您的支持。

编辑1)

对于第3点,我在SO上找到了这个答案:扩展django组和权限但问题是如何查询这些数据以及如何检查权限。如何重写 save() 方法以将元信息添加到属性“名称”?组名称可能类似于:“company_id#admin”或“company_id#manager”。

python django inheritance permissions usergroups
2个回答
1
投票

您可能正在寻找每个对象的权限。 Django 不支持开箱即用,但可以通过应用程序 Django-guardian


0
投票

据我了解,如果您已经使用自定义用户模型,最简单的方法是使用自定义模型覆盖 Django 的组模型。 django-group-model 包允许您轻松实现这一点,并与 Django 的权限框架完全兼容。

以下是有关安装软件包后如何执行此操作的简短摘要。请查看软件包文档,了解详细的流程。

创建一个自定义组模型,其中包含将其链接到公司的附加字段。有效地将团体限制为公司。

from django_group_model.models import AbstractGroup


class Group(AbstractGroup):
    company = models.Foreign("companyApp.Company", on_delete=models.CASCADE)

设置

AUTH_GROUP_MODEL
设置。

AUTH_GROUP_MODEL = 'myapp.Group' # Make sure to replace 'myapp' with the appropiate app

将组模型与您的用户模型一起使用


class User(AbstractUser, ...):
    ...
    groups = models.ManyToManyField(
        'myapp.Group',
        blank=True,
        related_name="user_set",
        related_query_name="user",
    )
    ...

您现在可以使用以下方式查询属于公司的

groups

company = Company.objects.first()
groups = company.group_set
permissions = groups.first().permissions

检查权限的方式与 Django 提供的默认

Group
模型相同。

如果您还想覆盖

name
Group
属性或将
Group
重命名为其他名称,包文档描述了如何执行此操作。

如果有什么遗漏的地方请告诉我,我会尽力解答。

注意,我专门开发这个包来轻松解决此类问题。

© www.soinside.com 2019 - 2024. All rights reserved.