2010-06-01 88 views
1

我有一個簡單的應用程序,用戶應該在匹配結果上下注。一場比賽包括兩支球隊,一個結果和一個賭注。在Django管理員中創建與團隊匹配,參與者將填寫結果和賭注。呈現多個表單實例

必須根據數據庫中的匹配動態生成表單。

我的想法是每個匹配都有一個(Django)Form實例,並將這些實例傳遞給模板。

它可以正常工作,當我從django shell執行它,但是實例在加載我的視圖時沒有呈現。

的形式如下:

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傳遞到模板和循環throught像這樣的集合,但id不起作用:

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

(輸出實際上是在每個字母之間添加空格的字典鍵 - 我不知道爲什麼...)

它的工作原理如果我只將一個Form實例傳遞給模板,並且只運行內部循環。

建議非常感謝。

回答

1

要在Django模板遍歷一個字典,你必須使用:

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

因此

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

應該做的伎倆!

否則,你可以把你的表單放在一個列表中,如果你的主要目標是保持它們的順序並且保留模板代碼,那麼這將更有意義!

+0

謝謝,這樣做!我同意將表單實例放入列表中是一個更好的主意。 – vorpyg 2010-06-01 21:07:39

5

再一次,頁面上有多種表單的最佳方式是使用formsets