我想在用户模型上注册一个信号处理程序,它看起来像这样:
def post_save_handler(sender, instance, created, **kwargs):
should_have_profile = instance.has_perm('profile.should_have')
if should_have_profile:
profile, created = Profile.objects.get_or_create(user=instance)
if crated:
profile.save()
else:
old_profile = Profile.objects.filter(user=instance)
if old_profile:
old_profile.delete()
但是,在信号处理程序中,对新权限(通过更改组成员身份在视图代码中添加或删除)的"has_perm"测试没有正确进入。就好像新的小组还没有被应用一样。
我曾短暂怀疑contrib.auth.backends.py中的_group_perm_cache
和_perm_cache
,但我增强了信号处理程序,从传入实例中删除了这些值,结果是一样的。
我所能推测的是,对当前组的任何更改都不会传递给这个用户。为此,我还尝试在User对象上注册一个m2m_changed
侦听器,但也没有调用(可能是因为User.groups没有实现为ManyToManyField)。
有什么办法可以恰当地做我想做的事吗?
m2m_changed
包含一个参数,该参数告诉更改发生在关系的哪一侧,因此这意味着它将双向工作。组是M2M,但ManyToManyField在Group
模型上,而不是在User
模型上。如果在connect
方法中传递sender
,那么它实际上应该是Group
,因为这是ManyToManyField所在的位置。不确定,但这是我唯一能想到的为什么你的m2m_changed
信号不会被发送的原因。