4

Deformを使用すると、フォームのさまざまなフィールドに検証を追加できます。ただし、フォーム自体が有効であることを確認しますが、必ずしもフォーム処理が有効であることを意味するわけではありません。

たとえば、フォームが電子メール アドレスを持つ新しいユーザーを作成するためのものであるとします。フォームは有効ですが、フォームの処理 (この新しいユーザーをデータベースに挿入する処理) で、この電子メール アドレスを持つユーザーが既に存在することを示すデータベース整合性エラーが発生します。

電子メールがまだ使用されていないことを確認する特別なバリデーターを追加できることはわかっていますが、それでも、最初のトランザクションのチェックとコミットの間にコミットする同じ電子メールを使用する別の同時トランザクションが存在する可能性があります。終わり。

では、フォームの後処理エラーをユーザーに適切に報告するにはどうすればよいでしょうか?

フォームの横にあるエラー メッセージ (フラッシュ メッセージなど) を簡単に報告できますが、通常の検証エラーが処理されるのとまったく同じように、ウィジェットでエラーを直接報告する方法があるかどうかを知りたいです。

4

1 に答える 1

1

私は同じ状況に直面し、これが通常の検証エラーとしてエラーを発生させる方法です。

バリデーターの方法:

def user_DoesExist(node,appstruct):
if DBSession.query(User).filter_by(username=appstruct['username']).count() > 0:
    raise colander.Invalid(node, 'Username already exist.!!')

スキーマ:

class UserSchema(CSRFSchema):
username = colander.SchemaNode(colander.String(), 
               description="Extension of the user")
name = colander.SchemaNode(colander.String(), 
               description='Full name')
extension = colander.SchemaNode(colander.String(), 
                description='Extension')
pin = colander.SchemaNode(colander.String(), 
          description='PIN')

意見:

  @view_config(route_name='add_user', permission='admin', renderer='add_user.mako')
def add_user(self):
    schema = UserSchema(validator = user_DoesExist).bind(request=self.request)
    form = deform.Form(schema, action=self.request.route_url('add_user'), buttons=('Add User','Cancel'))

    if 'Cancel' in self.request.params:
        return HTTPFound(location = self.request.route_url('home'))

    if 'Add_User' in self.request.params:
        appstruct = None
        try:
            appstruct = form.validate(self.request.POST.items())
        except deform.ValidationFailure, e:
            log.exception('in form validated')
            return {'form':e.render()}

これがあなたを助けることを願っています。ありがとう。

于 2013-08-28T12:00:39.127 に答える