我正在构建一个带有一个formset的应用程序,让我输入一些游戏分数,每个分数通过多对多的字段链接到一个玩家。我在遇到各种错误时遇到问题需要妥善保存。基本代码。
Model.py
class Player(models.Model):
name = models.CharField(max_length=30)
def __unicode__(self):
return self.name
class Score(models.Model):
score = models.DecimalField(max_digits=4, decimal_places=0)
turn = models.ForeignKey(Turn)
players = models.ManyToManyField(Player)
def __unicode__(self):
return self.score
然后每个分数加入转弯但我没有表现出来。
Form.py
class NewScore(ModelForm):
class Meta:
model = Score
fields = ('score', 'players',)
View.py
def newscore(request):
NewScoreFormSet = formset_factory(NewScore, extra=2)
if request.method == 'POST':
formset = NewScoreFormSet(request.POST)
if formset.is_valid():
t = Turn.objects.latest('id')
for form in formset:
p = form.cleaned_data.get('players')
scoreSave = form.save(commit=False)
scoreSave.turn = t
scoreSave.save()
scoreSave.players.add(p)
else:
print 'Formset not OK'
return render(request, 'scorer/game.html',
{})
else:
formset = NewScoreFormSet()
return render(request, 'scorer/game.html',
{'formset': formset,})
问题似乎是让玩家通过多对多字段保存,在当前设置中我收到错误消息
TypeError:int()参数必须是字符串或数字,而不是' QuerySet'
我也尝试删除该行
scoreSave.players.add(p)
但这根本不能保存玩家。只是得分和转弯。
答案 0 :(得分:1)
用于关联多对多关系中的实例的add()
方法需要一个或多个个别模型实例。您无法传递整个播放列表/查询集,但您可以逐个添加它们:
for player in p:
scoreSave.players.add(player)
当然这是相当冗长的,所以你可以使用python的语法糖同时调用add()
所有实例:
scoreSave.players.add(*p) # same as scoreSave.players.add(p[0], p[1], ...)