<p>斯宾德</p>
<p>至少目前我不知道如何在窗体向导中将多个窗体合并到一个页面上。在django1.2中,您将能够在FormWizards中包含表单集作为步骤(按照<a href="http://code.djangoproject.com/ticket/11112" rel="nofollow noreferrer">this ticket</a>),但是这些操作只处理相同表单的多个副本,而不是许多表单的编译。但有一种方法可以满足你的要求:</p>
<pre><code>from django.contrib.formtools.wizard import FormWizard
from django import forms
class SubjectForm(forms.Form):
subjects = forms.MultipleChoiceField(choices = (('language', 'language'),
('sport','sport')))
class RelatedQForm(forms.Form):
"""Overload the __init__ operator to take a list of forms as the first input and generate the
fields that way."""
def __init__(self, interested_subjects, *args, **kwargs):
super(RelatedQForm, self).__init__(*args, **kwargs)
for sub in interested_subjects:
self.field[sub] = forms.CharField(label = "What do you think about %s" % subject)
class SubjectWizard(FormWizard):
def done(self, request, form_list):
process_form_list(form_list)
def process_step(self, request, form, step):
if step == 1:
chosen_subs = form.cleaned_data['subjects']
self.form_list[1] = RelatedQForm(chosen_subs)
</code></pre>
<p>使用这段代码,您可以像在视图中一样实例化窗体向导,然后让wizard类处理幕后的一切。在</p>
<p>一般的想法是重载“RelatedQForm”的<strong>init</strong>类,以动态更改字段。此代码段取自<a href="http://www.b-list.org/weblog/2008/nov/09/dynamic-forms/" rel="nofollow noreferrer">here</a>。您可以让<strong>init</strong>运算符中的处理尽可能复杂,阅读“包括表单中的字段,就像elif块在for循环中一样”。。。你甚至可以想出一种方法,从你当前的表单中去掉这些字段,但我必须让他们来解决这个问题。在</p>
<p>您的“process_form_list”函数需要在字段上循环,使用类似的方法:</p>
^{pr2}$
<p>希望这能让你上路:)</p>