python - 如何知道用户属于哪个组
问题描述
我正在开发一个允许我控制属于某个组的用户的应用程序,但是我发现一个我不知道如何正确执行的问题,我目前有两个组,分别是白天和晚上,但是我有一个问题,那就是那些组他们被验证知道他们属于哪个组,因此只显示来自该组的信息,但是如果我想添加比我拥有的更多的组,有没有办法知道用户属于哪个组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)
解决方案
instance.groups.all()
将给出QuerySet
用户所属的组。因此,您可以检查用户是否属于administradores
with:
@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
组。
推荐阅读
- jmeter - JMeter Listener - 仅在发生错误时创建错误文件
- javascript - 如何解决无法在Jquery Datatable中设置未定义的属性'_DT_CellIndex'
- android-studio - 在 Flutter 中显示 ListView 的内容并显示从画廊上传的图像
- c - C 编程二维数组。为什么这个程序中的 int j 总是默认为零,即使它是一个自动变量?
- javascript - Jquery 每个循环不显示 JSON 项目的属性
- regex - 正则表达式捕获两个数字之间的第一个字符串
- c++ - 如何禁用 QProgressBar 的进度动画
- python - 长字符串不变,python-black能否将其转成multine
- netlogo - Netlogo:带有两个列表的“foreach”命令
- ios - 当视图位于 ScrollView 内时,onTapGesture 不起作用?