首页 > 解决方案 > 如何知道用户属于哪个组

问题描述

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

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)

标签: pythondjango

解决方案


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

@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'该测试 always 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组。


推荐阅读