2013-04-19 2 views
4

Deform을 사용하면 양식의 다른 필드에 유효성을 추가 할 수 있습니다. 그러나 양식 자체가 유효한지 검사하지만 반드시 양식 처리가 유효 함을 의미하지는 않습니다.변형이있는 HTML 컨트롤의 보고서 양식 처리 후 오류 메시지

예를 들어 양식이 이메일 주소로 새 사용자를 만드는 경우입니다. 양식은 유효하지만 양식 처리 (이 새 사용자를 데이터베이스에 삽입하는 것으로 구성됨)는 데이터베이스 무결성 오류를 발생시켜이 이메일 주소를 가진 사용자가 이미 있음을 나타냅니다.

전자 메일이 아직 사용되지 않았는지 확인하는 특수 유효성 검사기를 추가 할 수 있지만 첫 번째 트랜잭션 인 확인과 커밋 사이에 동일한 전자 메일이있는 다른 동시 트랜잭션이있을 수 있습니다. 이는 100이 아닙니다. % 안전.

그럼 어떻게 양식 사후 처리 오류를 사용자에게 제대로보고 할 수 있습니까?

양식 (플래시 메시지 또는 기타) 옆에있는 오류 메시지를 쉽게보고 할 수 있지만 정상적인 유효성 검사 오류가 처리되는 것과 똑같이 오류를 위젯에 직접보고하는 방법이 있는지 알고 싶습니다.

답변

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()} 

희망. 감사합니다. .

+0

이것은 사후 처리가 아니며 일반적인 인증 프로세스입니다. 내가 뭘하고 싶은지는'appstruct = form.validate (self.request.POST.items())'줄 뒤에 뭔가 잘못 될 때보고 오류입니다. –