保存Django formset与多对多字段

时间:2016-06-26 22:22:30

标签: python django django-forms

我正在构建一个带有一个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)

但这根本不能保存玩家。只是得分和转弯。

1 个答案:

答案 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], ...)