Django 信号触发但不保存
Django Signal Triggered But Not Saving
正如标题所说。 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_user_role
方法中的 if..else
在 django shell 中有效,但在我的信号中无效。我绝对不能再保存 instance
,因为那会导致 post 保存的无限循环。
无法保存到我的角色模型,因为权限必须保存到用户和组。
我猜这是对我应该如何使用信号或保存模型的误解。为什么我的权限没有被保存?以后我该怎么做才能避免这种情况?
解决了。
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_admin
是 Role
的成员,因此在 Role
的保存时触发信号更有意义。它在这里按预期工作。
正如标题所说。 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_user_role
方法中的 if..else
在 django shell 中有效,但在我的信号中无效。我绝对不能再保存 instance
,因为那会导致 post 保存的无限循环。
无法保存到我的角色模型,因为权限必须保存到用户和组。
我猜这是对我应该如何使用信号或保存模型的误解。为什么我的权限没有被保存?以后我该怎么做才能避免这种情况?
解决了。
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_admin
是 Role
的成员,因此在 Role
的保存时触发信号更有意义。它在这里按预期工作。