DjangoのFormPreviewで簡単にお問い合わせフォームを作る
投稿日:2008/03/04 23:38:58
過去の記事は移行時の問題により、画像が表示されなかったり、レイアウトが崩れたりしている可能性があります。
Tweet
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]
[/html]
確認画面のテンプレートです。{{ stage_field }}と{{ hash_field }}が必要になります。
hiddenになんでもかんでも突っ込んでる感じ。これってやっぱこういうもんなのかな。
再編集はボタンで戻らずに、内容確認の下にフォームを表示してます。これってこういうもんなのかな。
hashをとったりはしてるみたいですね。
contact_preview.html
[html]
[/html]
以上でお問い合わせフォーム的なものが出来ました。
きっとDjangoを多少でも使ったことがある人なら10分くらいでできそうです。
ちょっとソースでもながめながらもうちょい凝ったやつも作ってみようかな。
- Posted at:
- 2008/03/04 23:38:58
- 3 Comments
- 0 TrackBacks
- Tags:
- Trackback:
- http://blog.monospace.jp/2008/03/04/django_formpreview/trackback/
TrackBacks
まだ登録されていません。
Comments
fff
あべ
term paper writing services
私はそれは非常に有益見つけたので、私はあなたのポストを読んで楽しみました。あなたのブログでこれを共有する時間を割いてくれてありがとう。
プロモーションマーケティング
私は読書が好きで、私はこのウェブサイトはそれにいくつかの本当に便利なものを持って想像する!