Django注册卖家时提示Seller()收到意外关键字参数user如何解决?
错误原因
你定义的Seller模型中,关联User表的一对一字段命名为seller,但在表单SellerCreationForm的save方法中,创建Seller实例时传入了不存在的关键字参数user,Django无法匹配到对应字段因此抛出该错误。
解决方法
两种方案二选一即可:
方案1:修改表单创建逻辑(无需修改数据库结构,优先推荐)
把表单save方法中创建Seller实例的代码的参数名改为和模型字段一致:
原错误代码:
seller = Seller.objects.create(user=user)
修改为:
seller = Seller.objects.create(seller=user)
也可以直接把所有字段在创建时传入,省去二次保存的开销,优化后的完整save方法如下:
@transaction.atomic def save(self): user = super().save(commit=False) user.is_seller = True user.name = self.cleaned_data.get('name') user.save() seller = Seller.objects.create( seller=user, email=self.cleaned_data.get('email'), phone=self.cleaned_data.get('phone'), country=self.cleaned_data.get('country'), address=self.cleaned_data.get('address'), zipcode=self.cleaned_data.get('zipcode') ) return user
方案2:修改模型字段名
如果你希望后续关联字段统一用user命名,可以修改Seller模型的字段定义:
class Seller(models.Model): # 将原字段名seller改为user user = models.OneToOneField(User, on_delete = models.CASCADE) email = models.EmailField(max_length = 90, unique = True) country = models.CharField(max_length = 60) phone = models.CharField(max_length= 20, unique = True, blank = True, null = True) address = models.TextField() zipcode = models.CharField(max_length = 10)
修改后需要执行以下命令同步数据库结构:
python manage.py makemigrations python manage.py migrate
其他注意事项
- 确认
Account应用的User模型中已经定义了is_seller布尔字段和name字段,否则保存User实例时会抛出字段不存在的错误 - 视图代码中调用了
login方法但未导入对应依赖,需要补充导入:
from django.contrib.auth import login
内容的提问来源于stack exchange,提问作者Dhiman
相关产品推荐
相关产品推荐

