Python Pylons バリデーション
Pylonsのバリデーションを試してみます。
http://wiki.pylonshq.com/pages/viewpage.action?pageId=11174255
検証ルールクラスを作成します。
/model/form.py
というファイルを作成し、内容は以下のように。
import formencode
class EmailForm(formencode.Schema):
#FormEncode のデフォルトの振舞いでは、余分なフィールドを
#送信するとフォームが無効であるとみなされるので、
#allow_extra_fields = True を指定します。
#
#メールアドレス入力とSubmitボタンの2つがformに
#配置されているため、この設定を行わないと、
#Submitボタンにも検証が行われてします。
allow_extra_fields = True
#余分なフィールドの値を使用したいとは思わないので、
#filter_extra_fields = True を指定します。
filter_extra_fields = True
#メールフィールドが Email() バリデータでバリデートされる
#べきであると指定します。
#バリデータを作成する際に not_empty=True を指定しているので、
#メールフィールドは入力を必要とします。
email_field = formencode.validators.Email(not_empty=True)
allow_extra_fields = True
と設定していないと、メールアドレス入力欄以外
(Submitボタンすら)も検証対象となってしまい、
登録処理が行えなくなってしまいます。

filter_extra_fields = True
この設定の意味は・・・調べ中です。何なんだろ?
多分、phpフレームワークのsymfonyにヒントがあるのだと思いますが、
具体的な動作を理解していません。
最後の
email_field = formencode.validators.Email(not_empty=True)
は、空白禁止+メールアドレスのルールを設定しています。
次にコントローラーの記載です。
/controllers/hello.py
#作成したクラスのインポートを追加
from helloworld.model.form import EmailForm
#クラスのメソッドに追加
def form(self):
return render('/form.mako')
@validate(schema=EmailForm(), form='form')
def email(self):
return 'Your email is: %s' % request.params['email_field']
後はテンプレートの追加
/templates/form.mako
${h.form(h.url(action='email'), method='post')}
Email Address: ${h.text_field('email_field')}
${h.submit('Submit')}
${h.end_form()}
ポイントは、テンプレートで定義したメールアドレスの
入力フォームの名前「email_field」と、EmailFormで
使用している変数名「email_field」を一致させる
必要があるというところでしょうか。
こんな感じで、検証が実行されます。
未入力チェック

@マークがないよ

ドメイン名が不正

検証通過

ちなみに、エラーメッセージは
・spanタグではさまれる
・error-messageというclassが指定される
というルールがあるようで、cssを指定すれば、
ある程度表示を変更できるかと。
でもやっぱり日本語で表示したいので、エラーメッセージの
カスタマイズに挑戦してみます。
もどる