gpt4 book ai didi

python - 在 Django 1.9 中保存时将用户添加到组

转载 作者:太空宇宙 更新时间:2023-11-03 14:57:14 26 4
gpt4 key购买 nike

您好,我正在使用 Django 1.9。尝试在创建或保存时将用户添加到组中。使用 user.groups 或 groups.user_set.add 都不起作用,混合并匹配下面的保存前和保存后。

这些答案对我不起作用,所以这不是骗人的: Adding user to group on creation in Django
Adding a user to a group in django
Add users to groups in Django

我已经在保存前和保存后处理程序中尝试了这两种方法。

@receiver(pre_save, sender=User)
def user_presave_handler(sender, instance, **kwargs):
if instance.is_staff and not instance.is_superuser:
# Grant all permissions
try:
instance.groups.add(Group.objects.get(name='staff_user'))
except Group.DoesNotExist:
pass

@receiver(post_save, sender=User)
def user_postsave_handler(sender, instance, **kwargs):
if instance.is_staff and not instance.is_superuser:
try:
g = Group.objects.get(name='staff_user')
except Group.DoesNotExist:
pass
else:
g.user_set.add(instance)
g.save()

你可以混搭哪个方法用哪个地方,我试过了。我在测试中只使用一种方法。点击用户管理页面上的保存按钮后,该用户未显示在组中。

我仔细检查了处理程序是否被调用、用户逻辑是否正确等。

我是不是哪里做错了,或者 1.9 中有什么变化打破了旧方法?

谢谢!

编辑:对于那些提问的人,该组是这样创建的:

group, __ = Group.objects.get_or_create(name='staff_user')

permissions = Permission.objects.all()
for p in permissions:
group.permissions.add(p)
group.save()

我已经调试过了,这个组确实存在,但也许我弄错了,所以它不会被应用?

最佳答案

我认为与此有关:Issue with ManyToMany Relationships not updating inmediatly after save .有人在评论中报告说它在 1.10 中仍然是最新的。

问题是您还可以在管理员“添加用户”页面上选择组;然后当您保存用户时,会发生以下情况:

  1. 用户已保存
  2. 出现保存后信号,您将用户添加到组
  3. 清除所有用户组
  4. 在添加用户页面上选择的组被添加到用户。

显然,您可以使用 m2m_changed 信号。我从来没有用过它,但我认为这样的东西应该有用:

from django.db.signals import m2m_changed

@receiver(m2m_changed, sender=User.groups.through)
def user_groups_changed_handler(sender, instance, action, **kwargs):
if action == 'post_add' and instance.is_staff and not instance.is_superuser:
if not instance.groups.filter(name='staff_user').exists():
try:
g = Group.objects.get(name='staff_user')
except Group.DoesNotExist:
pass
else:
instance.groups.add(g)

这是假设信号接收到的 instance 是一个用户,否则它看起来会略有不同。检查操作和检查组是否已添加是为了防止无限循环。发件人是多对多关系的隐藏“直通”表,User.groups.through

关于python - 在 Django 1.9 中保存时将用户添加到组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41574022/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com