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

标签 python django

我环顾四周,找不到最近的片段或如何分配 group 的示例到 Django 中的模型。我的项目有公司和学生我想使用装饰器只允许公司运行某些 View 。我发现最好的方法是为我的公司模型分配一个名为 company 的组,然后使用如下装饰器: 我已经在网站管理员中创建了群组。

@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

那么我可以将 Company 类的每个对象分配给一个组吗?其他解决方案也很受欢迎。

最佳答案

由于您的公司背后有一个用户,您可以使用django 的内置组管理。

将用户添加到组:

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

然后您可以使用 user_passes_test 装饰器只允许组 company 的成员访问 View

@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)

关于python - 如何将组添加到模型的每个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36068074/

相关文章:

python - 将 Router 与 Django REST Framework 一起使用时,如何让 APIViews 和 ViewSets 显示在 API Root 上?

django - 如何使用 django-rest-framework 测试客户端测试二进制文件上传?

django - 使用FileField测试Django模型

python - 找到另一个具有目标路径的文件 - 那个文件在哪里?

python - 使用 python 使用 selenium 从弹出窗口中获取项目列表

python - 如何打印lda主题模型和每个主题的词云

python - 如何检测被阴影遮挡的黄色物体?

javascript - 如何在 Python 中使用 Flask 压缩/最小化 JSON/Jsonify 的大小?

python - “dict_keys”对象不支持索引

python - 禁用链接以在 django 的管理员中编辑对象(仅显示列表)?