2014-06-17 4 views
0

데이터를 쉽게 입력 할 수 있도록보기를 모방 한 양식을 생성하려고합니다. 각 플레이어에 대해 두 개의 하위 헤더가있는 최상위 열 머리글 인 점수 시트입니다. 양식은 현재 플레이어를 삽입하는 프리팩 장고 방법을 사용하지 않고 올바르게 생성하고 제출합니다. This은 양식 템플릿의 현재 html 출력이며 두 개의 레코드와 추가 양식을 보여줍니다 (------ 버튼은 모든 행에 대해 같고 쿼리 세트에 의해 채워진 행에 반영됩니다. 추가로 또는 저장시 초기화하고 싶습니다.)Django formsets : 모델 formset의 목록에서 추가 필드 값을 초기화하는 중

양식

class ScoreForm(ModelForm): 
    game = IntegerField(widget=HiddenInput()) 

    class Meta: 
     model = Score 
     exclude = ['chouette'] 
     widgets={'score': TextInput(attrs={'size': 6}), 'position': TextInput(attrs={'size':3})} 

보기

def manage_scores(request, chnum=1):  
    chobj = Chouette.objects.get(number = chnum) 
    chid = chobj.id 
    p_list = Score.objects.filter(chouette = chid).distinct('player').order_by('player').values_list('player', 'player__handle') 
    playernum = p_list.count() 
    lastgamequery = Score.objects.filter(chouette = chid).latest('game') 
    newgame = lastgamequery.game + 1 
    ScoreFormSet = modelformset_factory(Score, form = ScoreForm, extra = playernum) 
    if request.method == "POST": 
     formset = ScoreFormSet(request.POST) 
     for f in formset: 
      f.fields['game'].initial=newgame 
     if formset.is_valid(): 
      newscores = formset.save(commit = False) 
      for newscore in newscores: 
       newscore.chouette = chobj 
       newscore.save() 
      return redirect('update', chnum=chnum) 
    else: 
     formset = ScoreFormSet(queryset = Score.objects.filter(chouette = chid).order_by('game', 'player')) 
     for f in formset: 
      f.fields['game'].initial = newgame 
    return render(request, "manage_scores.html", {'player_list' : p_list, 'formset' : formset, 'newgame' : newgame}) 

그리고 템플릿 :

<form method='post' action=''> 
    {% csrf_token %} 
    {{ formset.management_form }} 
    <table class='table'> 
     <thead> 
      <tr><th></th> 
      {% for player in player_list %} 
      <th class="text-center" colspan="2" >{{ player.1 }}</th> 
      {% endfor %} 
      </tr> 
      <tr> 
      <th class="text-center">Game</th> 
      {% for player in player_list %} 
      <th class="text-center">Score</th><th class="text-center">Position</th> 
      {% endfor %} 
     <tbody> 
     {% regroup formset by instance.game as game_list %} 
     {% for game in game_list %} 
      <tr><td class="text=center"> 
      {% if game.grouper %} 
       {{game.grouper}} 
      {% else %} 
       {{ newgame }} 
      {% endif %} 
      </td> 
      {% for g in game.list %} 
       {{ g.id }} 
       {{ g.game }} 
       <td class="text-center">{{ g.player }}{{ g.score}}</td> 
       <td class="text-center">{{ g.position }}</td> 
      {% endfor %} 
     {% endfor %}</tr> 
    </table> 
    <input type="submit" class="btn btn-default btn-sm" role="button" value="Update" /> 
</form> 

현재 템플릿에있는 {{g.player}}을 사용하면 양식을 테스트 할 수 있지만 분명히 대답은 아닙니다. 재 그룹은 formset에 전달 된 쿼리 세트 데이터로 모든 것을 올바른 위치에 배치하지만 추가 폼을 미리 채울 수는 없습니다. 모든 지침을 매우 높이 평가하고 코드의 나머지 부분에 대한 무자비한 공격도 환영합니다.이 기사를 처음 접했고 반복되는 SO 검색과 함께 꽤 많이 자갈을 썼습니다.

답변

0

지금까지는 플레이어 필드를 양식에서 제외하고 chouette 값이 전달 된 것과 같은 방식으로 플레이어 값을 "newscores"개체로 전달하여 문제를 해결했습니다. 보기와 관련된 코드 :

 if formset.is_valid(): 
      newscores = formset.save(commit = False) 
      pid=0 
      for newscore in newscores: 
       newscore.chouette = chobj 
       if newscore.game == newgame: 
        newscore.player = p_obj[pid] 
       pid +=1 
       newscore.save() 
관련 문제