2016-06-26 5 views
0

私はフォームセットを使用して、少数のアプリケーションを構築しています。私はこれを様々なエラーで適切に保存するのに問題があります。基本コード。多人数フィールドでDjangoフォームセットを保存する

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() argument must be a string or a number, not 'QuerySet'

私もこのラインを削除しようとしました

scoreSave.players.add(p) 

しかし、これはプレーヤーをまったく保存しません。ちょうどスコアとターン。

答えて

1

add()多対多リレーションシップのインスタンスの関連付けには、個の個別のモデルインスタンスが1つ以上必要です。あなたは選手のリスト全体/クエリセットを渡すことはできませんが、それらを一つずつ追加することができます。

for player in p: 
    scoreSave.players.add(player) 

もちろんこれはかなり冗長なので、一度にすべてのインスタンスでadd()を呼び出すためのPythonのシンタックスシュガーを使用することができます。

scoreSave.players.add(*p) # same as scoreSave.players.add(p[0], p[1], ...) 
+0

ありがとうございました! – Spinnaay

関連する問題