【问题标题】:Where does my django signals look for a missing argument Created in the createprofile function?我的 django 信号在哪里寻找在 createprofile 函数中创建的缺失参数?
【发布时间】:2021-07-09 17:14:59
【问题描述】:

我在创建用户后使用 django 信号来创建配置文件,但我收到这个奇怪的错误,告诉我创建配置文件函数缺少创建的参数,我什至在没有装饰器的情况下尝试过,但它不起作用。我不知道我错过了什么。

这是模型和信号本身。

 class Profile(models.Model):
    user = models.OneToOneField(
        User, verbose_name="user", related_name="profile", on_delete=models.CASCADE
    )
    full_name = models.CharField(max_length=150, blank=True, null=True)
    date_of_birth = models.DateField(blank=True, null=True)
    bio = models.TextField()
    location = models.CharField(max_length=100, blank=True, null=True)
    picture = models.ImageField(
        default="media/profile_pics/default.jpg", upload_to="media/profile_pics"
    )
    date_created = models.DateTimeField(default=timezone.now)
    date_updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f"{self.user.username}'s profile"


@receiver(pre_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)


@receiver(pre_save, sender=User)
def create_profile(sender, instance, **kwargs):
    instance.profile.save()

我正在使用 django allauth 进行身份验证和授权。

这是来自终端的错误

     File "C:\Users\Papis\Desktop\Dev\projects\lib\site-packages\allauth\account\adapter.py", line 246, in save_user
    user.save()
  File "C:\Users\Papis\Desktop\Dev\projects\lib\site-packages\django\contrib\auth\base_user.py", line 67, in save
    super().save(*args, **kwargs)
  File "C:\Users\Papis\Desktop\Dev\projects\lib\site-packages\django\db\models\base.py", line 726, in save
    self.save_base(using=using, force_insert=force_insert,
  File "C:\Users\Papis\Desktop\Dev\projects\lib\site-packages\django\db\models\base.py", line 750, in save_base
    pre_save.send(
  File "C:\Users\Papis\Desktop\Dev\projects\lib\site-packages\django\dispatch\dispatcher.py", line 180, in send
    return [
  File "C:\Users\Papis\Desktop\Dev\projects\lib\site-packages\django\dispatch\dispatcher.py", line 181, in <listcomp>
    (receiver, receiver(signal=self, sender=sender, **named))
TypeError: create_profile() missing 1 required positional argument: 'created'
[09/Jul/2021 18:54:00] "POST /accounts/signup/ HTTP/1.1" 500 136997

【问题讨论】:

    标签: django django-models django-signals


    【解决方案1】:

    post_save 信号将是您在此处寻找的信号。

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

    【讨论】:

    • 谢谢,这是一个愚蠢的错误,但另一个问题是为什么我们需要保存它,因为 create 方法调用了 save 方法
    • 我认为不需要第二个信号。可能是为了保证User/Profile关系存在,但是好像是多余的保存。
    猜你喜欢
    • 1970-01-01
    • 2014-01-19
    • 2012-12-23
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 2017-03-01
    • 2018-10-25
    • 1970-01-01
    相关资源
    最近更新 更多