【发布时间】:2022-01-24 15:10:28
【问题描述】:
我必须在我的用户模型中添加一个 progress_level 字段,以显示该用户目前所处的位置,因此我向用户模型添加了一个字段,如下所示:
progress_level = models.CharField(max_length=25, null=True, choices=USER_PROGRESS_LEVELS)
我希望该字段在用户完成操作时自动更新。例如,如果用户完成了他们的联系信息和文档信息并提交了他们的表单,则进度级别应该更改为 [1][0]。我真的不知道该怎么做,但我创建了一个这样的信号:
@receiver(pre_save, sender=User, dispatch_uid='progress_change')
def progress(sender, instance, **kwargs):
user = instance
if DocumentInfo.objects.filter(user=user).exists() and ContactInfo.objects.filter(user=user).exists():
user.progress_level = USER_PROGRESS_LEVELS[1][0]
它工作正常,但只有在我保存用户模型时才会激活。我该如何防止呢?每当该陈述为真时,我如何激活此信号?如果有更好的方法来做到这一点,请帮助我。我真的不知道信号是否是正确的方法。 这些是我的模型:
class User(AbstractUser):
id = models.AutoField(primary_key=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
isPreRegistered = models.BooleanField(default=False)
username = models.CharField(unique=True, max_length=13)
first_name = models.CharField(max_length=32, null=True, default=None)
last_name = models.CharField(max_length=64, null=True, default=None)
gender = models.CharField(max_length=10, null=True, choices=GENDER)
progress_level = models.CharField(max_length=25, null=True, choices=USER_PROGRESS_LEVELS)
isDetailViewed = models.BooleanField(default=False)
class DocumentInfo(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
certificate = models.FileField(upload_to="documents")
id_card = models.FileField(upload_to="documents")
service_certificate = models.FileField(upload_to="documents")
educational_certificate = models.FileField(upload_to="documents")
############EDIT############## 我将此保存方法添加到我的用户模型中。它有效,但我希望它更新用户模型而不保存它。我的意思是我希望它检查文档和联系信息模型,如果它们存在,请更新该 progress_level。我必须从管理页面手动保存用户模型才能发生这种情况。我该如何解决它
def save(self, *args, **kwargs):
if self.documentinfo and self.contactinfo:
self.progress_level = USER_PROGRESS_LEVELS[4][0]
return super(User, self).save(*args, **kwargs)
【问题讨论】: