2016-06-26 2 views
0

나는 많은 필드를 통해 플레이어에 연결되는 수많은 게임 점수를 입력 할 수있는 formset으로 작은 앱을 구축하고 있습니다. 다양한 오류가 발생하여 제대로 저장하지 못하는 문제가 있습니다. 기본 코드.많은 필드가 포함 된 Django 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() argument must be a string or a number, not 'QuerySet'

나는 또한 라인을 제거하는 시도

scoreSave.players.add(p) 

하지만 그저 플레이어를 저장하지는 않습니다. 그냥 점수와 차례.

답변

1

many-to-many 관계에서 인스턴스를 연결하는 데 사용되는 add() 메서드는 하나 이상의 개별 모델 인스턴스를 사용합니다. 당신은 플레이어의 전체 목록/검색어 세트를 전달할 수 없습니다,하지만 당신은 하나씩 추가 할 수 있습니다 : 당신이 한 번에 모든 인스턴스와 add()을 호출하기위한 파이썬의 문법 설탕을 사용할 수 있도록,이 오히려 장황 물론

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

:

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

대단히 고마워요! – Spinnaay

관련 문제