2013-04-19 3 views
4

Deform позволяет добавить подтверждение в разные поля формы. Тем не менее, он проверяет, что форма действительна сама по себе, но это не обязательно означает, что обработка формы будет действительна.Форма сообщения после обработки сообщений об ошибках в элементах управления HTML с помощью Deform

Например, если форма предназначена для создания нового пользователя с адресом электронной почты. Форма действительна, но обработка формы (которая заключается в вставке этого нового пользователя в базу данных) повышает погрешность целостности базы данных, поскольку уже существует пользователь с этим адресом электронной почты.

Я знаю, что могу добавить специальный валидатор, который проверяет, что письмо еще не используется, но все же может быть другая параллельная транзакция с тем же адресом электронной почты, который совершает транзакцию между проверкой и фиксацией первой транзакции, которая не является 100 % в конце.

Итак, как я могу отчетливо сообщить об ошибках после обработки для пользователя?

Я мог бы легко сообщить об ошибках рядом с формой (флэш-сообщение или другое), но я хотел бы знать, есть ли способ сообщить об ошибке непосредственно в виджетах точно так же, как обрабатываются обычные ошибки проверки.

ответ

1

Я столкнулся с такой же ситуацией, и это, как я достигаю, чтобы поднять ошибку, как обычную ошибку проверки.

метод Validator:

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()). – 2013-08-30 07:32:18

Смежные вопросы