フォームプレビュー
| revision-up-to: | 7127 (0.97pre SVN) |
|---|
Django には、フォームプレビュー (form preview) アプリケーションが付属してい ます。フォームプレビューは「HTMLフォームを表示し、プレビューを行わせ、フォー ム提出時に何らかの処理を行う」というワークフローを自動化する上で役立ちます:
ちょっとした Python クラスを書くだけで、プレビューつきのフォームアプリケー ションを作成できます。
概要
フォームプレビューフレームワークは、 django.contrib.formtools.preview.FormPreview のサブクラスを定義すること で、以下のワークフローを管理できるようにします:
- フォームを HTML 形式で Web ページ上に表示します。
- フォームデータが POST で提出されると、データを検証します。 a. データの検証に成功したら、プレビューページを表示します。 b. 検証に失敗したら、エラーメッセージつきでフォームを再表示します。
- プレビューページで「承認 (confirm)」フォームを提出すると、予め定義 しておいた done() メソッドをフックします。 dome() メソッドに は、検証済みのデータが渡されます。
フォームプレビューフレームワークは、隠しフィールドを使って、プレビューペー ジに共有鍵のハッシュ値を渡します。プレビューページのフォームパラメタを変更 してフォームを提出しようとすると、ハッシュ比較テストに失敗します。
FormPreview の使い方
Django にデフォルトのフォームプレビューテンプレートの場所を設定します:
- INSTALLED_APPS 設定に 'django.contrib.formtools' を追加し ます。 TEMPLATE_LOADERS 設定に app_directories テンプレー トローダを指定 (デフォルトで指定されています) しておく必要もありま す。 テンプレートローダのドキュメント も参照してください。
- app_directories を使わない場合、 TEMPLATE_DIRS 設定に django/contrib/formtools/templates の絶対パスを追加してください。
FormPreview のサブクラスを作成し、 done() メソッドをオーバラ イドします:
from django.contrib.formtools.preview import FormPreview from myapp.models import SomeModel class SomeModelFormPreview(FormPreview): def done(self, request, cleaned_data): # cleaned_data を使って何らかの処理を行い、 # "success" ページにリダイレクトする return HttpResponseRedirect('/form/success')このメソッドは HttpRequest オブジェクトと、バリデーション・クリー ニング済みのフォームデータの入った辞書を引数にとります。メソッドは プレビュー内容を承認した後に遷移する先のページにリダイレクトする HttpResponseRedirect を返さねばなりません。
URLconf を変更して、 FormPreview サブクラスを import します:
from myapp.preview import SomeModelFormPreview from myapp.models import SomeModel from django import newforms as formsそして、 URLconf に以下の行を追加します。モデルからフォームを生成す るなら、以下のようにするとよいでしょう:
(r'^post/$', SomeModelFormPreview(forms.models.form_for_model(SomeModel))),独自にフォーム作成しているなら、以下のようにします:
(r'^post/$', SomeModelFormPreview(SomeModelForm)),Django のサーバを実行して、ブラウザで /post/ にアクセスします。
FormPreview のクラス
フォームプレビュークラスは、プレビューのワークフローを表現する単純な Python のクラスです。 フォームプレビュークラスを作成するときには、 django.contrib.formtools.preview.FormPreview のサブクラスを作成して、 done() メソッドをオーバライドします。フォームプレビュークラスは、コード ベースのどこに置いても構いません。
FormPreview のテンプレート
デフォルトでは、フォームは formtools/form.html を使ってレンダされます。 また、プレビューページのレンダには foormtools/preview.html を使います。 これらのテンプレートは、 FormPreview のサブクラスで、それぞれ preview_template および fom_template 属性を設定すればオーバライド できます。デフォルトのテンプレートの内容は django/contrib/formtools/templates を参照してください。