フォームプレビュー

revision-up-to:7127 (0.97pre SVN)

Django には、フォームプレビュー (form preview) アプリケーションが付属してい ます。フォームプレビューは「HTMLフォームを表示し、プレビューを行わせ、フォー ム提出時に何らかの処理を行う」というワークフローを自動化する上で役立ちます:

ちょっとした Python クラスを書くだけで、プレビューつきのフォームアプリケー ションを作成できます。

概要

フォームプレビューフレームワークは、 django.contrib.formtools.preview.FormPreview のサブクラスを定義すること で、以下のワークフローを管理できるようにします:

  1. フォームを HTML 形式で Web ページ上に表示します。
  2. フォームデータが POST で提出されると、データを検証します。 a. データの検証に成功したら、プレビューページを表示します。 b. 検証に失敗したら、エラーメッセージつきでフォームを再表示します。
  3. プレビューページで「承認 (confirm)」フォームを提出すると、予め定義 しておいた done() メソッドをフックします。 dome() メソッドに は、検証済みのデータが渡されます。

フォームプレビューフレームワークは、隠しフィールドを使って、プレビューペー ジに共有鍵のハッシュ値を渡します。プレビューページのフォームパラメタを変更 してフォームを提出しようとすると、ハッシュ比較テストに失敗します。

FormPreview の使い方

  1. Django にデフォルトのフォームプレビューテンプレートの場所を設定します:

    • INSTALLED_APPS 設定に 'django.contrib.formtools' を追加し ます。 TEMPLATE_LOADERS 設定に app_directories テンプレー トローダを指定 (デフォルトで指定されています) しておく必要もありま す。 テンプレートローダのドキュメント も参照してください。
    • app_directories を使わない場合、 TEMPLATE_DIRS 設定に django/contrib/formtools/templates の絶対パスを追加してください。
  2. 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 を返さねばなりません。

  3. 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)),
    
  4. 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 を参照してください。