创建Django超级用户时触发TypeError:Update_Profile缺少必需参数'self'
解决创建超级用户时的TypeError问题
错误原因
你写的Update_Profile信号接收器函数多了一个self参数,但它并不是类的成员方法——Django在触发post_save信号调用这个函数时,只会传递instance(当前保存的User实例)、created(是否是新创建的对象)和**kwargs这几个参数,根本不会传入self,所以就会抛出"missing 1 required positional argument: 'self'"的错误。
简单来说:普通函数形式的信号接收器不需要self,这个参数只适用于类的成员方法,你的接收器是独立函数,加self完全多余。
修正后的代码
直接把self参数删掉就可以解决问题:
@receiver(post_save, sender=User) def Update_Profile(instance, created, **kwargs): if created: UserProfile.objects.create(user=instance) instance.user_profile.save()
额外优化建议
顺便提一句:当created为True时,你刚通过UserProfile.objects.create()创建了关联的用户档案,这时候它已经被保存到数据库了,不需要再调用instance.user_profile.save()。可以优化成这样,避免不必要的数据库操作:
@receiver(post_save, sender=User) def Update_Profile(instance, created, **kwargs): if created: UserProfile.objects.create(user=instance) else: # 只有当用户信息更新时,才保存对应的档案(比如你在其他地方修改了user_profile的字段) instance.user_profile.save()
内容的提问来源于stack exchange,提问作者bounty
相关产品推荐
相关产品推荐

