Django创建对象报错:player_team()收到意外关键字参数'player'、'team'
Django创建对象报错:player_team() got unexpected keyword arguments: 'player', 'team'
问题原因
报错源于两个核心问题:
- 字段名大小写不匹配:模型里定义的ForeignKey字段是大写的
Player和Team,但视图创建对象时用了小写的player和team,Django对模型字段名大小写严格区分,导致识别不到对应字段。 - ID类型与传递方式错误:
request.POST.get()获取到的是字符串类型的ID,而ForeignKey字段需要整数类型的ID(或模型实例),直接传递字符串会引发类型错误;同时用字段名_id后缀传递ID是更直接的方式。
修正代码
模型代码(可选:遵循PEP8规范优化命名)
建议模型类名和关联模型名采用大驼峰命名(符合Python编码规范),字段名改为小写更易读:
# 先确保关联的模型类名正确(比如player改为Player,team改为Team) class Player(models.Model): name = models.CharField(max_length=100) # 其他Player模型字段 class Team(models.Model): name = models.CharField(max_length=100) # 其他Team模型字段 class PlayerTeam(models.Model): player = models.ForeignKey(Player, on_delete=models.CASCADE) team = models.ForeignKey(Team, on_delete=models.CASCADE, null=True)
视图代码(针对现有模型的直接修正)
如果暂时不想修改模型命名,按以下方式修正视图:
def assign_team(request): if request.method == "POST": player_id = request.POST.get("Players") team_id = request.POST.get("Teams") # 方式1:匹配模型定义的大写字段名,转换ID为整数 player_team.objects.create( Player=int(player_id), Team=int(team_id) if team_id else None ) # 方式2:使用字段名+_id后缀(更推荐,无需查询模型实例) # player_team.objects.create( # Player_id=int(player_id), # Team_id=int(team_id) if team_id else None # ) return redirect(request.META['HTTP_REFERER'])
关键说明
- 字段名必须和模型定义完全一致,大小写不能出错。
- POST请求获取的ID是字符串,必须转换为整数才能传递给ForeignKey字段;由于Team字段允许为空,要处理
team_id为空的情况,避免int(None)报错。 - 推荐使用
字段名_id的方式传递ID,无需先查询模型实例,性能更优。
内容的提问来源于stack exchange,提问作者odafe omajuwa
相关产品推荐
相关产品推荐

