2014-12-30 1 views
0

내 설정에는 게임 인스턴스와 팀이 게임을 묶는 양식이 포함됩니다. 게임에 묶여있는 팀 세트는 GameTeamsFormset이라는 형식 세트에 입력됩니다.검증을 통과했지만 레코드를 저장하지 않는 빈 formset

내 문제는 때로는 GameTeamsFormset의 필드가 비어있는 것입니다. 이어야합니다. 내 데이터베이스에 빈 레코드를 만듭니다 (예, 원하는 경우).하지만 formset이 유효성 검사를 통과하더라도 레코드가 실제로 생성되지 않습니다. 관리자를 통해 이러한 빈 레코드를 수동으로 추가 할 수 있습니다. (게임 인스턴스에 외래 키가 묶여 있으므로 완전히 비어있는 것은 아닙니다.) 그래서, 어떻게 내 양식을 내 각 빈 양식에 대한 레코드를 저장하려면 내 의견을 얻으려면?

Views.py

def addGame(request, league_id): 
    if request.method == 'POST': 

     league = League.objects.get(pk = league_id) # get the league object 
     gameform = GameForm(request.POST) # initialize gameform with the POST data 
     if gameform.is_valid(): 
      newgame = gameform.save(commit=False) 
      newgame.league = league # set the league 

      gameteamsform = GameTeamsFormset(request.POST, instance=newgame) 
      if gameteamsform.is_valid(): 
       newgame.save() # save the game 
       gameteamsform.save() 
       return editleague(request, league_id) 

      else: 
       return HttpResponseRedirect("/") #needs fixin 
     else: 
      return HttpResponseRedirect("/") #needs fixin 
    else: 
     return HttpResponseRedirect("/") #needs fixin 

Forms.py은

class GameForm(ModelForm): 
    class Meta: 
     model = Game 
     fields = ['game_heading', 'game_date', 'game_time'] 
     widgets = { 
      'game_heading':TextInput(attrs={'type':'text', 'class':'form-control input-md'}), 
      'game_date':TextInput(attrs={'type':'date', 'class':'form-control'}), 
      'game_time':TextInput(attrs={'type':'time', 'class':'form-control'}), 
     } 


GameTeamsFormset = inlineformset_factory(Game, GameTeams, extra=2, 
    fields=['team', 'placed', 'score'], 
    widgets={'team': Select(attrs={'class':'form-control'}), 
      'placed': Select(attrs={'class':'form-control'}), 
      'score': TextInput(attrs={'class':'form-control'})}, 
    ) 

답변

1

은 FormSets는 빈 기록을 무시하도록 설계되었습니다. 당신은 개별적으로 저장해야 할 것이다 (아마도 관련 키를 설정해야 할 것이다). 게시물 코드에서 너무

:

if request.POST: 
    forms_factory = modelformset_factory(...) 
    forms = forms_factory(request.POST) 
    if forms.is_valid(): 
     for form in forms: 
      form.instance.game = newgame 
      form.save() 

나는이 또한 빈 양식을 통해 반복 할 생각이 돌아왔다.

def addGame(request, league_id): 
    if request.method == 'POST': 

     league = League.objects.get(pk = league_id) # get the league object 
     gameform = GameForm(request.POST) # initialize gameform with the POST data 
     if gameform.is_valid(): 
      newgame = gameform.save(commit=False) 
      newgame.league = league # set the league 

      gameteamsform = GameTeamsFormset(request.POST, instance=newgame) 
      if gameteamsform.is_valid(): 
       newgame.save() # save the game 
       for gameteam in gameteamsform: 
        gameteam.game = newgame 
        gameteam.save() 
       gameteamsform.save() 
       return editleague(request, league_id) 

      else: 
       return HttpResponseRedirect("/") #needs fixin 
     else: 
      return HttpResponseRedirect("/") #needs fixin 
    else: 
     return HttpResponseRedirect("/") #needs fixin 
관련 문제