FormWizardを使いこなすための注意点
環境はPython2.5+Django1.0.3
trunkをみてもdjango/contrib/formtools/wizard.pyの最終更新はr8679なので、Django1.1でも同じかな。
問題点
基本的な使い方はドキュメントにあるとおりだが、おそらく実際には使えない。問題は3つ。
- FormWizardのextra_contextが、クラス変数な辞書。
- ウィザードを URLconf に組み込むとき、インスタンスを設定する。
- 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から必要な情報を取り出す