Если у вас нет причин беспокоиться об удержании POST ваших данных формы, вы можете использовать скрытые поля форм во втором и третьем представлениях для передачи данных. Подумайте об этих строках ...
forms.py
# override EACH form's init to change the widget for each field to a hidden widget if is_hidden kwarg passed.
class form_step_1(forms.Form):
def __init__(self, *args, **kwargs):
is_hidden = kwargs.pop('is_hidden', None)
super(FormName, self).__init__(*args, **kwargs)
if is_hidden:
for field in self.fields:
self.fields[field].widget = forms.HiddenInput()
# Be sure to do this for each form with hidden input needed
views.py
@app.route('/form/step1', methods=['GET', 'POST'])
def form_step1():
form1 = form_step_1(request.POST)
...validate()...
return render_template('register.html', {'form':form1})
@app.route('/form/step2', methods=['GET', 'POST'])
def form_step2():
form1 = form_step_1(request.POST, is_hidden=True)
hidden_forms =[form1]
form2 = form_step_2(request.POST)
...validate()...
return render_template('register.html', {'form':form2, 'hidden_forms':hidden_forms})
@app.route('/form/step3', methods=['GET', 'POST'])
def form_step3():
form1 = form_step_1(request.POST, is_hidden=True)
form2 = form_step_2(request.POST, is_hidden=True)
hidden_forms =[form1, form2]
form = form_step_3(request.form)
...validate()...
if form.is_valid():
# do stuff, save to DB
form1.save()
form2.save()
form3.save()
return HttpReturnRedirect('/success_page/') # Always Redirect after posting form
# if not valid, show again.
return render_template('register.html', {'form':form, 'hidden_forms':hidden_forms })
template.html (assuming you are using a single template for each page
Теперь, когда ваша форма переходит к POST на шаге 3, если она действительна, доступны данные каждой формы из предыдущих шагов.
Если вы хотите найти безрассудное решение (требуется немного больше работы), посмотрите на Django FormWizard