revision-up-to: | 8961 (1.0) |
---|
Django には、フォームプレビュー (form preview) アプリケーションが付属してい ます。フォームプレビューは「HTMLフォームを表示し、プレビューを行わせ、フォー ム提出時に何らかの処理を行う」というワークフローを自動化する上で役立ちます:
ちょっとした Python クラスを書くだけで、プレビューつきのフォームアプリケー ションを作成できます。
フォームプレビューフレームワークは、 django.forms.Form のサブクラ スを定義するだけで、以下のワークフローを管理できるようにします:
フォームプレビューフレームワークは、隠しフィールドを使って、プレビューペー ジに共有鍵のハッシュ値を渡します。プレビューページのフォームパラメタを変更 してフォームを提出しようとすると、ハッシュ比較テストに失敗します。
Django にデフォルトのフォームプレビューテンプレートの場所を設定します:
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 クラスは、プレビューのワーク フローを表現する単純な Pythonのクラスです。 フォームプレビュークラスを作成 するときには、django.contrib.formtools.preview.FormPreview のサブ クラスを作成して、 done() メソッ ドをオーバライドします。フォームプレビュークラスは、コードベースのどこに置 いても構いません。
デフォルトでは、フォームは formtools/form.html を使ってレンダされま す。また、プレビューページのレンダには formtools/preview.html を使 います。これらのテンプレートは、 FormPreview のサブクラスで、それぞれ preview_template および form_template 属性を設定すれ ばオーバライドできます。デフォルトのテンプレートの内容は "file"django/contrib/formtools/templates を参照してください。
Aug 31, 2012