Django信号触发但未保存

时间:2017-11-17 20:43:13

标签: django django-models django-signals django-permissions django-guardian

正如标题所说。正在触发post_save接收器,并且这些方法中的权限正在更改,但它们在管理页面上保持不变。

这是我正在使用的模型,仅剥离到相关部分。

from django.contrib.auth.models import User
from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver
from guardian.shortcuts import assign_perm, remove_perm

class Role(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    is_admin = models.BooleanField(default=False)

@receiver(post_save, sender=User)
def create_user_role(sender, instance, created, **kwargs):
    if created:
        Role.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_role(sender, instance, **kwargs):
    if instance.role.is_admin:
        assign_perm('auth.add_user', instance)
    else:
        remove_perm('auth.add_user', instance)
    instance.role.save()

if..else方法中的save_user_role适用于django shell,但不适用于我的信号。我绝对不能再次保存instance,因为这会导致无限期的帖子保存。

保存到我的角色模型不起作用,因为必须将权限保存到用户和组。

我猜这是对我应该如何使用信号或保存模型的误解。为什么我的权限没有保存?我将来可以做些什么来避免这种情况?

1 个答案:

答案 0 :(得分:0)

解决了它。

class Role(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    is_admin = models.BooleanField(default=False)

@receiver(post_save, sender=Role)
def assign_user_perms(sender, instance, **kwargs):
    if instance.is_admin:
        assign_perm('auth.add_user', instance.user)
    else:
        remove_perm('auth.add_user', instance.user)

@receiver(post_save, sender=User)
def create_user_role(sender, instance, created, **kwargs):
    if created:
        Role.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_role(sender, instance, **kwargs):
    instance.role.save()

由于is_adminRole的成员,因此在Role的保存时触发信号会更有意义。它按预期在这里工作。