扩展Django User模型时Profile()传入未预期'user'参数报错
错误原因与修复步骤
直接触发报错的根因
Profile() got an unexpected keyword argument 'user'是典型的关键字参数与模型字段名不匹配导致的报错:
- 你的Profile模型中关联User的外键字段定义为
user_ref,但在信号函数中实例化Profile对象时,传入的参数是user=user,Django在Profile模型的字段列表里找不到名为user的属性,直接抛出参数不识别的运行时错误。
需要修复的全部代码问题
- 修正models.py中的信号逻辑,解决字段名错配、语法错误、空引用风险三个问题:
- 替换Profile实例化时的错误参数名,与模型字段保持一致
- 修正
save_profile函数的缩进错误,避免Python语法解析失败 - 增加Profile对象存在性判断,避免用户实例触发信号时找不到关联Profile的空引用报错
修正后可直接运行的models.py代码:
from django.db import models from django.contrib.auth.models import User from django.db.models.signals import post_save from django.dispatch import receiver class Profile(models.Model): user_ref = models.OneToOneField(User, on_delete=models.CASCADE, related_name="profile") pr1_points = models.IntegerField(default=0) pr2_points = models.IntegerField(default=0) @receiver(post_save, sender=User) def create_profile(sender, instance, created, **kwargs): if created: Profile.objects.create(user_ref=instance) @receiver(post_save, sender=User) def save_profile(sender, instance, **kwargs): if hasattr(instance, "profile"): instance.profile.save() - 优化注册视图中的冗余逻辑:
User.objects.create_user()方法本身会完成用户实例的数据库写入操作,自然触发post_save信号完成Profile创建,代码中额外调用的user.save()属于冗余操作,会造成信号重复触发,删除即可。
修正后的核心视图逻辑片段:user = User.objects.create_user( username=username, first_name=first_name, last_name=last_name, email=email, password=password1 ) return redirect('login')
后续注意事项
- 给OneToOneField配置
related_name="profile"后,可直接通过user.profile的反向关联语法访问对应用户的Profile对象,避免因为字段名是user_ref导致的反向访问名不一致问题。 - 完成模型代码调整后,依次执行
makemigrations和migrate命令,确保表结构与模型定义同步。
内容的提问来源于stack exchange,提问作者Nishit Popat
相关产品推荐
相关产品推荐

