如果你看過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