2010-06-01 3 views
1

사용자가 경기 결과에 내기를해야하는 간단한 응용 프로그램이 있습니다. 경기는 결과와 지분이라는 두 팀으로 구성됩니다. Django 관리자는 팀과의 일치를 만들고 참가자는 결과와 스테이크를 작성해야합니다.여러 폼 인스턴스 렌더링

양식은 데이터베이스의 일치 항목을 기반으로 동적으로 생성되어야합니다.

제 아이디어는 매치마다 하나의 (Django) Form 인스턴스를 갖고이 인스턴스를 템플릿에 전달하는 것입니다.

장고 껍질에서 할 때 잘 작동하지만 내보기를로드 할 때 인스턴스가 렌더링되지 않습니다.

양식은 다음과 같습니다

class SuggestionForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     try: 
      match = kwargs.pop('match') 
     except KeyError: 
      pass 
     super(SuggestionForm, self).__init__(*args, **kwargs) 
     label = match 
     self.fields['result'] = forms.ChoiceField(label=label, required=True, choices=CHOICES, widget=forms.RadioSelect()) 
     self.fields['stake'] = forms.IntegerField(label='', required=True, max_value=50, min_value=10, initial=10) 

내를 (예비)보기는 다음과 같습니다

def suggestion_form(request): 
    matches = Match.objects.all() 
    form_collection = {} 

    for match in matches: 
     f = SuggestionForm(request.POST or None, match=match) 
     form_collection['match_%s' % match.id] = f 

    return render_to_response('app/suggestion_form.html', { 
     'forms': form_collection, 
     }, 
     context_instance = RequestContext(request) 
     ) 

내 초기 생각 나는 템플릿과 루프 축복하는에 form_collection를 통과 할 수 있었다 이런 컬렉션,하지만 이드는 작동하지 않습니다 :

 {% for form in forms %} 
      {% for field in form %} 
       {{ field }} 
      {% endfor %} 
     {% endfor %} 

각 문자 사이에 공백이있는 dict 키 - 이유는 모르겠다 ...)

템플릿에 하나의 Form 인스턴스 만 전달하고 내부 루프 만 실행하면 작동합니다.

제안 사항을 매우 높이 평가합니다.

답변

1

는 장고 템플릿에서 사전을 반복하려면 사용해야합니다 :

{% for key,value in dictionary.items %}{{ value }}{% endfor %} 

때문에

{% for key, value in forms.items %} 
    {% for field in value %} 
     {{ field }} 
    {% endfor %} 
{% endfor %} 

트릭을해야을!

그렇지 않으면 양식을 목록에 넣을 수 있습니다. 주된 목표가 주문을 보존하고 서식 파일 코드를 그대로 유지하는 것이 더 바람직합니다.

+0

감사합니다. 대신 양식 인스턴스를 목록에 넣는 것이 더 좋습니다. – vorpyg

5

페이지에 여러 양식을 갖는 가장 좋은 방법은 formsets을 사용하는 것입니다.