Вероятно, это поможет, если вы прочитаете код 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
Если я правильно понимаю ваш вопрос, вы хотите, чтобы на 2-м шаге отображалась конкретная форма на основе выбора пользователя из 1-й формы. В этом случае первое, что я могу попробовать, - это создать динамическую универсальную форму для 2-го шага, где используемые поля основаны на результатах из первой формы (не проверено):
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