Django信号已触发但未保存

Django信号已触发但未保存,django,django-models,django-signals,django-permissions,django-guardian,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.shortc

正如标题所说。正在触发
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()
save\u user\u role
方法中的
if..else
在django shell中起作用,但在我的信号中不起作用。我肯定不能再保存
实例
,因为这会导致无限次的后期保存循环

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

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

解决了它

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()
由于
角色
的成员,因此在保存
角色
时触发信号更有意义。它在这里按预期工作。

解决了它

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

由于
角色
的成员,因此在保存
角色
时触发信号更有意义。它在这里正常工作。

调用
assign\u perm()
后需要保存实例。它如何不作为信号工作?到底发生了什么?你确定这两个接收器是按你期望的顺序处理的吗?为什么不在一个接收器中执行这两个操作?@kichik如果我在接收器中保存实例,我会再次触发
post\u save
信号,并导致MaxRecusionDepth错误(只是为了安全再次尝试)。如果我需要保存它,为什么它在django shell中工作而不显式保存它?至于收件人订单/数量,订单触发正确,我有多个作为概念证明。对不起,这是一个输入错误。我的意思是你不需要保存这个实例
assign_perm()
完成您需要的所有操作。不管怎样,你能补充更多的信息吗?当然,关于什么?我会把它添加到主体中,比如你期望发生的事情,实际发生的事情,它在shell中的不同之处,以及你如何在shell中执行它。现在读这个问题,我不明白if..else
是如何失败的。它总是去别的地方吗?它根本不执行吗?是否未定义
角色
是否\u admin
错误?调用
assign\u perm()
后需要保存实例。它如何不作为信号工作?到底发生了什么?你确定这两个接收器是按你期望的顺序处理的吗?为什么不在一个接收器中执行这两个操作?@kichik如果我在接收器中保存实例,我会再次触发
post\u save
信号,并导致MaxRecusionDepth错误(只是为了安全再次尝试)。如果我需要保存它,为什么它在django shell中工作而不显式保存它?至于收件人订单/数量,订单触发正确,我有多个作为概念证明。对不起,这是一个输入错误。我的意思是你不需要保存这个实例
assign_perm()
完成您需要的所有操作。不管怎样,你能补充更多的信息吗?当然,关于什么?我会把它添加到主体中,比如你期望发生的事情,实际发生的事情,它在shell中的不同之处,以及你如何在shell中执行它。现在读这个问题,我不明白if..else
是如何失败的。它总是去别的地方吗?它根本不执行吗?是否未定义
角色
管理是否有误?