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