FormWizardで確認画面を表示する

djangoのFormWizardは各ページにそれぞれフォームをレンダリングして、入力値をセッションやcookieに保存しておいて、最後に全てvalidな状態のデータを揃えて、登録処理なりなんなりを行うというものですが、単純に今までの入力値の表示確認をしたい場合とかどうすればいいのでしょうか


以前試した時のWizardView

class OrderWizard(SessionWizardView):
    form_list = [AuthenticationForm, AddressForm, PaymentForm]

    def done(self, form_list, **kwargs):
        # 入力値を使って、登録処理などを行い、
        # 実際はリダイレクトさせる
        return render_to_response('apps/done.html', {
            'form_data': [form.cleaned_data for form in form_list],
        })


調べてたらなるほどと思える解決策が見つかりました。
FormPreview or Confirmation before post? · Issue #24 · stephrdev/django-formwizard · GitHub


単純ですが、空のフォームを用意する、というものです。
やってみます

#forms.py
class DummyFrom(forms.Form):
    pass

#views.py
class OrderWizard(SessionWizardView):
    form_list = [AuthenticationForm, AddressForm, PaymentForm, DummyForm]

    def get_context_data(self, form, **kwargs):
        ctx = super(OrderWizard, self).get_context_data(form, **kwargs)

        # 確認表示用に値を追加
        if self.steps.current == u'3':

            address_form = self.get_form(step=u'1',
                                         data=self.storage.get_step_data(u'1'))
            payment_form = self.get_form(step=u'2',
                                         data=self.storage.get_step_data(u'2'))

            ctx.update({'address_form': address_form,
                        'payment_form': payment_form})
        return ctx


    def done(self, form_list, **kwargs):
        # 入力値を使って、登録処理などを行い、
        # 実際はリダイレクトさせる
        return render_to_response('apps/done.html', {
            'form_data': [form.cleaned_data for form in form_list],
        })

# urls.py
url(r'^order/$', OrderWizard.as_view([AuthenticationForm, AddressForm, PaymentForm, DummyForm])),


テンプレートに適当に値を表示できるようにしておきます

...

{% for field in address_form %}
    <p>{{ field.label }}:{{ field.value }}</p>
{% endfor %}
{% for field in payment_form %}
    <p>{{ field.label }}:{{ field.value }}</p>
{% endfor %}

...





確認画面が表示できました。


u'1'とかu'2'とかマジックナンバーがうざいですがちゃんとステップに名前をつけることもできます。それはまた今度書く