revision-up-to: | 11321 (1.1) |
---|
Django には、フォームプレビュー (form preview) アプリケーションが付属してい ます。フォームプレビューは「HTMLフォームを表示し、プレビューを行わせ、フォー ム提出時に何らかの処理を行う」というワークフローを自動化する上で役立ちます:
ちょっとした Python クラスを書くだけで、プレビューつきのフォームアプリケー ションを作成できます。
フォームプレビューフレームワークは、 django.forms.Form
のサブクラ
スを定義するだけで、以下のワークフローを管理できるようにします:
- フォームを HTML 形式で Web ページ上に表示します。
- フォームデータが POST で提出されると、データを検証します。 a. データの検証に成功したら、プレビューページを表示します。 b. 検証に失敗したら、エラーメッセージつきでフォームを再表示します。
- プレビューページで「承認 (confirm)」フォームを提出すると、予め定義 しておいたフックメソッド、
done()
を呼出します。 このフックメソッドには検証済みのデータが渡されます。
フォームプレビューフレームワークは、隠しフィールドを使って、プレビューペー ジに共有鍵のハッシュ値を渡します。プレビューページのフォームパラメタを変更 してフォームを提出しようとすると、ハッシュ比較テストに失敗します。
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.forms import SomeModelForm from django import formsそして、 URLconf に以下の行を追加します。モデルからフォームを生成す るなら、以下のようにするとよいでしょう:
(r'^post/$', SomeModelFormPreview(SomeModelForm)),
SomeModelForm
はモデルのフォームまたはモデルフォームクラスです。Django のサーバを実行して、ブラウザで
/post/
にアクセスします。
FormPreview
クラス¶FormPreview
¶FormPreview
クラスは、プレビューのワーク
フローを表現する単純な Pythonのクラスです。 フォームプレビュークラスを作成
するときには、django.contrib.formtools.preview.FormPreview
のサブ
クラスを作成して、 done()
メソッ
ドをオーバライドします。フォームプレビュークラスは、コードベースのどこに置
いても構いません。
FormPreview
のテンプレート¶デフォルトでは、フォームは formtools/form.html
を使ってレンダされま
す。また、プレビューページのレンダには formtools/preview.html
を使
います。これらのテンプレートは、
FormPreview
のサブクラスで、それぞれ
preview_template
および
form_template
属性を設定すれ
ばオーバライドできます。デフォルトのテンプレートの内容は
“file”django/contrib/formtools/templates を参照してください。
Oct 26, 2017