使用Deform在HTML控件中报告表单处理后错误消息

时间:2013-04-19 10:42:18

标签: python pyramid deform colander

Deform允许在表单的不同字段上添加验证。但是,它会检查表单本身是否有效,但这并不一定意味着表单处理有效。

例如,如果表单用于创建具有电子邮件地址的新用户。表单有效,但表单处理(包括将此新用户插入数据库)会引发数据库完整性错误,表示已有用户使用此电子邮件地址。

我知道我可以添加一个特殊的验证器,用于检查电子邮件是否尚未使用但是仍然可能存在另一个并发事务,该电子邮件在检查和第一个事务的提交之间提交,这不是100%最后安全。

那么,我怎样才能很好地向用户报告表单处理后错误?

我可以轻松地报告表单旁边的错误消息(flash消息或其他),但我想知道是否有办法直接在小部件中报告错误,就像处理正常的验证错误一样。

1 个答案:

答案 0 :(得分: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()}

希望这会对你有所帮助。 感谢。