Django信号处理程序监视对组的更改&权限?

时间:2011-06-09 02:00:22

标签: django django-signals

我想在User模型上注册一个看起来像这样的信号处理程序:

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)。

有没有办法正确地做我想要的事情?

1 个答案:

答案 0 :(得分:0)

m2m_changed包含一个参数,用于说明发生变化的关系的哪一方,这意味着它将双向工作。组是M2M,但ManyToManyField位于Group模型上,而不是User模型。如果您在sender方法中传递connect,则它可能实际上应为Group,因为这是ManyToManyField所在的位置。不确定,但这是我唯一可以想到的,为什么你的m2m_changed信号不会被发送。