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を指定すれば、
ある程度表示を変更できるかと。

でもやっぱり日本語で表示したいので、エラーメッセージの
カスタマイズに挑戦してみます。


もどる