DjangoのFormPreviewで簡単にお問い合わせフォームを作る

現在このブログは中途半端に移行されていますので、画像が表示されなかったり、レイアウトが崩れたりする可能性があります。
この記事を旧ブログで閲覧するには、以下のURLからご覧ください。
http://blog2.monospace.jp/2008/03/04/django_formpreview/

Twitterでは超便利とか言ってたんだけど、多分用途を選ぶんだろうなあ。 とりあえずお問い合わせフォームとの相性は良さそうです。 フォームプレビュー : Django オンラインドキュメント和訳 ちょうど簡単なお問い合わせフォームを作る機会があったので使ってみました。 今回のお問い合わせフォームは、 名前: ___________________________ メールアドレス: ___________________________ コメント: ___________________________ [確認画面] っていうよくある簡単なフォームです。 項目を入力して、確認画面をクリックすると検証されて、問題なければ内容確認画面へ行き、 エラーがあるとフォームに戻ってエラー内容を表示します。 確認画面では、入力した内容の表示と[送信]ボタンが表示され、クリックすると実際にフォームを送信する処理をします。 フォームの送信が完了すると入力内容をあらかじめ登録した管理者宛にメールで飛ばします。 という流れがFormPreviewを使うと簡単に実装できます。 汎用ビューのフロー版的なものになるのかな、汎用フローみたいな。 では、まずmodels.pyを書きます。 ごく普通の簡単なモデルです。 と、その前に、settings.pyのINSTALLED_APPSに「django.contrib.formtools」を追加する必要があるようです。 [python] from django.db import models class Contact(models.Model): name = models.CharField(max_length=50) email = models.EmailField() message = models.TextField() [/python] 次にurls.py /contact/というURLにアクセスされた場合にFormPreviewを使います。 views.pyのContactFormPreviewとforms.pyのContactFormは後で書きます。 [python] from django.conf.urls.defaults import * from app.contact.views import ContactFormPreview from app.contact.forms import ContactForm urlpatterns = patterns('', (r'^contact/', ContactFormPreview(ContactForm)) ) [/python] 次にforms.py ModelFormを使ってContactFormクラスを書きます。 ModelFormを使うと上の方で作ったモデルクラスを元にフォームの調整ができます。 ここでラベル名を設定してみたり、表示ウィジェットを指定したり、属性を足したりできます。 [python] from django import newforms as forms from app.contact.models import Contact class ContactForm(forms.ModelForm): name = forms.CharField(label=u'お名前または会社名', widget=forms.TextInput(attrs={'class': 'text-box'})) email = forms.CharField(label=u'メールアドレス', widget=forms.TextInput(attrs={'class': 'text-box'})) comment = forms.CharField(label=u'お問い合わせ内容', widget=forms.Textarea) class Meta: model = Contact [/python] 最後にviews.py ここにFormPreviewをサブクラス化したContactFormPreviewを書きます。 ここでするのは、フォームの初期状態のテンプレートの指定と確認画面のテンプレートの指定と送信完了後の処理です。 送信完了後の処理は、done()というメソッドをオーバーライドします。 このとき、引数で受け取るcleaned_dataの様子が違うのでちょっとはまった。 [python] rom django.contrib.formtools.preview import FormPreview from django.http import HttpResponseRedirect class ContactFormPreview(FormPreview): preview_template = 'contact_preview.html' # 確認画面のテンプレート form_template = 'contact.html' # 初期状態&エラーで戻ってきたときのテンプレート def done(self, request, cleaned_data): name = ''.join(cleaned_data['name']) # cleaned_data['name']がタプルで返ってくるためjoinでつないでる email = ''.join(cleaned_data['email']) message = ''.join(cleaned_data['message']) # メール送信処理 省略.... return HttpResponseRedirect('/contact/thanks/') # 送信完了ページへリダイレクト [/python] ちなみにテンプレートの一部ものせておきます。 contact.html [html]

お問い合わせフォーム

{% if form.errors %}

入力内容にエラーがあります。

{% endif %}
{{ form.name.label }}
{{ form.name }}
{{ form.email.label }}
{{ form.email }}
{{ form.comment.label }}
{{ form.comment }}

[/html] 確認画面のテンプレートです。{{ stage_field }}と{{ hash_field }}が必要になります。 hiddenになんでもかんでも突っ込んでる感じ。これってやっぱこういうもんなのかな。 再編集はボタンで戻らずに、内容確認の下にフォームを表示してます。これってこういうもんなのかな。 hashをとったりはしてるみたいですね。 contact_preview.html [html]
{% for field in form %}{{ field.as_hidden }}{% endfor %}

お問い合わせフォーム 内容確認


{{ form.name.data }}
{{ form.email.data }}
{{ form.comment.data }}

お問い合わせフォーム 再編集


{{ form.name.label }}
{{ form.name }}
{{ form.email.label }}
{{ form.email }}
{{ form.comment.label }}
{{ form.comment }}

[/html] 以上でお問い合わせフォーム的なものが出来ました。 きっとDjangoを多少でも使ったことがある人なら10分くらいでできそうです。 ちょっとソースでもながめながらもうちょい凝ったやつも作ってみようかな。
Posted at: 
2008/03/04 23:38:58
1 Comment
0 TrackBacks
Tags: 
Trackback: 
http://blog.monospace.jp/2008/03/04/django_formpreview/trackback/

TrackBacks

まだ登録されていません。

Comments

fff

あべ

Created at: 
2008/11/27 17:49:00

Add Comment

Add Comment