2012-10-01 43 views
1

這裏是我有什麼,一個簡單的Django的形式,現在如何使用Django表單字段多次在GET或POST

class survey (forms.Form): 
    answer = forms.ChoiceField(
           widget = RadioSelect(), 
           choices = answers_select 
           ) 

,我的HTML頁面上,我得到的不只是一個問題,但很多!是否有可能在所有問題中使用上述answer字段?對於所有問題,我必須展示相同的選擇!

說我有3個問題:

  1. 如何爲我的餐廳
  2. 是怎樣的食物
  3. 是怎樣的服務

選擇了上述answer場均1. good, 2. bad 3. worst 所以,我不想爲3個問題創建3個表單域作爲冗餘

回答

2

退一步,並認真思考 - 你將需要3 ChoiceField跟蹤3個單獨問題的答案,並且沒有辦法繞過它。

什麼是多餘的是實際重複表單字段構造調用,特別是如果你正在處理,比如20個問題。在這種情況下,不是靜態構造這些字段,而是可以將問題列表存儲爲類不變量,並在表單構造期間動態創建表單字段。

這裏的東西給你,你會如何做一個開始的想法:

class SurveyForm(forms.Form): 
    questions = _create_questions('How is my restaurant?', 
            'How is the Food?', 
            'How is the service?') 

    def __init__(self, *args, **kwargs): 
     # Create the form as usual 
     super(SurveyForm, self).__init__(*args, **kwargs) 

     # Add custom form fields dynamically 
     for question in questions: 
      self.fields[question[0]] = forms.ChoiceField(label=question[1], 
                  widget=forms.RadioSelect(), 
                  choices=answers_select) 
    @classmethod 
    def _create_questions(cls, *questions): 
     return [(str(index), question) for index, question in enumerate(questions)] 
1

您正在尋找formsets。你可以做這樣的事情:

from django.forms.formsets import formset_factory 
SurveyFormSet = formset_factory(survey, extra=3, max_num=3) 

將它添加到您的上下文:

def get_context_data(self, request, *args, **kwargs): 
    data = super(MyView, self).get_context_data(request, *args, **kwargs) 
    data['formset'] = SurveyFormSet() 
    return data 

然後使用它的模板:

<form method="post" action=""> 
    {{ formset.management_form }} 
    <table> 
     {% for form in formset %} 
     {{ form }} 
     {% endfor %} 
    </table> 
</form> 

在一個帖子,你會想將request.POST和request.FILES傳遞給formset構造函數:

formset = SurveyFormSet(request.POST, request.FILES) 

在相關鏈接文檔中,所有內容都十分詳盡。

相關問題