Django扩展User模型报错:Registration()收到意外关键字参数'myuser'的解决方案
解决Django扩展User模型时的TypeError问题
嘿,这个问题其实很好排查——你在创建Registration实例的时候用错了字段名,导致Django识别不了这个参数。咱们来一步步拆解问题和修复方法:
问题根源
先看你的models.py,Registration模型和User关联的字段明明定义的是user:
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
但在views.py里,你创建Registration对象时却传了myuser=myuser这个参数——Django只认你在模型里定义的字段名user,自然会抛出unexpected keyword argument 'myuser'的错误。
直接修复方案
修改views.py中创建Registration实例的那一行代码:
原错误代码
reg = Registration(dob=dob,myuser=myuser)
修正后代码
reg = Registration(dob=dob, user=myuser)
改完之后再测试注册流程,这个错误应该就消失了。
额外的优化建议
为了避免以后再犯类似的字段名错误,或者简化代码,你可以试试这些方案:
- 用Django信号自动关联创建:在
models.py里添加信号处理,这样每次创建User对象时,会自动生成对应的Registration实例,不用手动写创建逻辑:
之后你只需要在注册时更新from django.db.models.signals import post_save from django.dispatch import receiver @receiver(post_save, sender=User) def create_user_registration(sender, instance, created, **kwargs): if created: Registration.objects.create(user=instance) @receiver(post_save, sender=User) def save_user_registration(sender, instance, **kwargs): instance.registration.save()Registration的fname、lname、dob字段就行。 - 改用官方推荐的扩展User方式:如果你的项目还在初期阶段,更推荐使用
AbstractUser或者AbstractBaseUser来扩展用户模型,这是Django官方更推崇的方案,能避免后续很多关联模型的麻烦。
内容的提问来源于stack exchange,提问作者Anil Kumar
相关产品推荐
相关产品推荐

