2009-08-10 26 views
0

我有2天的想法如何做到這一點。Django WizardForm和第二種形式將是「動態」

我有兩種形式(確實是4種),第一種形式有單選按鈕,如果用戶選擇x單選按鈕選項,第二種形式將會不同。

像我的英語一樣對不起。

生病解釋:

第一形式有單選按鈕的選項,與選項生病帶來的「所謂的形式」,我有3個形式,對等待。

我在閱讀有關WizardForm,但我不知道如何以動態的方式帶來第二種形式。

請需要一些幫助,這:(

感謝

回答

2

如果你看過contrib/formtools/wizard.py代碼它可能會有所幫助。這是非常簡單,下面它會給你的,你需要什麼更好的感覺

有一個process_step掛鉤在那裏,你需要在你自己的表單嚮導中重寫。我所做的是看看我做了什麼步驟來做一些特殊的處理,如果表單驗證了(即它有cleaned_data):

class MyFormWizard(FormWizard): 

    def process_step(self, request, form, step): 
     if step == 0 and hasattr(form, 'cleaned_data'): 
      # Do special stuff 

如果我正確理解您的問題,您希望第二步根據用戶的第一種形式選擇特定的表單。在這種情況下,我可能會嘗試首先是要建立一個動態的通用形式的第二步,其中使用的字段基於從第一形式的結果(未經測試):

def process_step(self, request, form, step): 
     if step == 0 and hasattr(form, 'cleaned_data'): 
      # The initial attribute is a dictionary which maps the step number 
      # to a dictionary of what should be initial values. 
      # You can use/abuse this in a form's constructor 
      self.initial[1] = {'fields': {'field1': field, 'field2': another}} 

然後,在你的第二個表格

class MySecondForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     super(StatBuilderForm2, self).__init__(*args, **kwargs) 

     for name, field in kwargs['initial']['fields'].iteritems(): 
       self.fields[name] = field 
相關問題