如何知道用户属于哪个组

时间:2020-12-23 19:31:31

标签: python django

我正在开发一个应用程序,允许我控制属于某个组的用户,但我发现一个问题,我不知道如何正确执行,我目前有两个白天和黑夜的组,但是我有一个问题,那就是那些组 他们经过验证可以知道他们属于哪个组,因此只显示来自该组的信息,但是如果我想添加比我更多的组,有没有办法知道哪个组用户所属等能够验证我在模板中显示的信息,这是我的模型:

class User(AbstractUser):

    def get_full_name(self):
        return f'{self.first_name} {self.last_name}'


@receiver(post_save, sender=User)
def group_user(sender, instance, *args, **kwargs):
    if instance.groups:
        if instance.groups == 'diurno':
            group = Group.objects.get(name='diurno')
            instance.groups.clear()
            instance.groups.add(group)
        else:
            group = Group.objects.get(name='nocturno')
            instance.groups.clear()
            instance.groups.add(group)

这是我的观点:

class CarListView(LoginRequiredMixin, ListView):
    login_url = 'users:login'
    template_name = 'index.html'
    paginate_by = 6

    def get_queryset(self):
        group = self.request.user.groups.filter(
            name='diurno').exists()
        if group:
            return Car.objects.annotate(Count('partner')).order_by('-pk')
        else:
            user = User.objects.filter(pk=self.request.user.pk).first()
            return Car.objects.filter(user=user)

2 个答案:

答案 0 :(得分:3)

instance.groups.all() 将给出用户所属的 QuerySet 组。因此,您可以使用以下命令检查用户是否属于 administradores

@receiver(post_save, sender=User)
def group_user(sender, instance, *args, **kwargs):
    if instance.groups:
        if instance.groups.filter(name='diurno').exists():
            group = Group.objects.get(name='diurno')
            instance.groups.clear()
            instance.groups.add(group)
        else:
            group = Group.objects.get(name='nocturno')
            instance.groups.clear()
            instance.groups.add(group)

通过检查 instance.groups == 'diurno',该测试始终为 False,因此您每次保存用户对象时都会将其分配给 desarrolladores 组。然而,通过清除组,用户永远不能属于多个组。

在您看来,您可以通过以下方式稍微提高可读性:

class CarListView(LoginRequiredMixin, ListView):
    model = Car
    login_url = 'users:login'
    template_name = 'index.html'
    paginate_by = 6

    def get_queryset(self, *args, **kwargs):
        qs = super().get_queryset(*args, **kwargs)
        is_diurno = self.request.user.groups.filter(
            name='diurno'
        ).exists()
        if is_diurno:
            return qs.annotate(Count('partner')).order_by('-pk')
        else:
            return qs.filter(user=self.request.user)

然而,我强烈建议不要使用信号,而是将逻辑添加到您编辑用户的视图中。请注意,post_save 方法在您编辑用户组时不会运行,只有在您保存用户本身时才会运行。这意味着当您创建一个用户时,它会首先保存用户(没有任何组),然后将组添加到用户。这使得信号的工作方式更难以预测。如果您因此创建一个属于 diurno 组的用户:在信号运行后,该用户将同时属于 diurno nocturno 组.

答案 1 :(得分:2)

# all groups a user belongs to
user.groups.all()

# check if a user belongs to a specific group, returns a boolean
user.groups.filter(name="NameOfYourGroup").exists()

# check if a user belongs to at least one group from a list, returns a boolean
user.groups.filter(name__in=['list','of','groups']).exists()

相关问题