FormWizardを使いこなすための注意点

環境はPython2.5+Django1.0.3
trunkをみてもdjango/contrib/formtools/wizard.pyの最終更新はr8679なので、Django1.1でも同じかな。

問題点

基本的な使い方はドキュメントにあるとおりだが、おそらく実際には使えない。問題は3つ。

  1. FormWizardのextra_contextが、クラス変数な辞書。
  2. ウィザードを URLconf に組み込むとき、インスタンスを設定する。
  3. process_stepの引数で渡されるformがクリーニングされていない。ドキュメントにはクリーニング済みって書いてあるのに・・・

という感じなので、それぞれに対策が必要。でないと別リクエストの内容が混在してしまい、使い物になりません。

サブクラスでインスタンス変数なextra_contextを宣言する。

#forms.py
from django.contrib.formtools import wizard
class HogeWizard(wizard.FormWizard):
    def __init__(self, form_list, initial=None):
        super(HogeWizard, self).__init__(form_list, initial)
        self.extra_context = {}

URLconfにインスタンスを組み込まない。

面倒でもビューを作成しましょう。

#views.py
import forms
def create_wizard(request, *args, **kwargs):
    return forms.HogeWizard([forms.Hoge1Form, forms.Hoge2Form])(request, *args, **kwargs)

#urls.py
from django.conf.urls.defaults import patterns, url
import views
urlpatterns = patterns('',
    url(r'^wizard/hoge/$', views.create_wizard),
)

process_stepの引数で渡されるformをクリーニングする。

#forms.py
from django.contrib.formtools import wizard
class HogeWizard(wizard.FormWizard):
    def process_step(self, request, form, step):
        form.clean()
        #formから必要な情報を取り出す