如何将组添加到模型的每个实例

时间:2016-03-17 17:48:02

标签: python django

我环顾四周,无法找到最近的代码段或如何在Django中为模型分配group的示例。我的项目有公司和学生我想使用装饰器只允许公司运行某些视图。我找到的最好的方法是为我的公司模型分配一个名为company的组,然后使用装饰器,如: 我已经在网站admin中创建了该组。

@group_required('company')
def myview(request, id):
...

我的公司型号:

class Company(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, unique = True)
    name = models.CharField(max_length=100,blank= False)
    def __str__(self):
        return self.name

所以我可以将班级公司的每个对象分配给一个组吗?其他解决方案也很受欢迎。

1 个答案:

答案 0 :(得分:1)

由于贵公司背后有User,您可以使用django的内置群组管理功能。

将用户添加到群组:

from django.contrib.auth.models import Group
g = Group.objects.get(name='company') 
g.user_set.add(your_user)

然后,您可以使用user_passes_test装饰器仅允许访问组company

成员的视图
@user_passes_test(lambda u: u.groups.filter(name='company').exists())
def company_view(request):
    ...

编辑:

要将每个公司用户自动添加到公司组,您可以使用signals。这将在Company模型save方法之后运行。

from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=Company)
def chat_entry_created(sender, instance, created, **kwargs):
    if created:
        g = Group.objects.get(name='company') 
        g.user_set.add(instance.user)