2013-02-22 5 views
8

Как определить пользовательский валидатор в Deform/Colander, который имеет доступ к всем значениям узлов. Мне нужно получить доступ к значениям из двух полей, чтобы решить, действительно ли какое-либо значение действительно или нет?Валидатор Deform/Colander, который имеет доступ ко всем узлам?

ответ

2

осязаемо ответ:

def verify_email_validator(form, values): 
    if values['email_address'] != values['verify_email']: 
     raise Invalid(form, 'Email values do not match') 

class MySchema(MappingSchema): 

    def __init__(self, *args, **kwargs): 
     super(KickEntrySchema, self).__init__(*args, **kwargs) 
     self.validator=verify_email_validator # entire form validator 

    email_address = SchemaNode(Email()) 
    verify_email = SchemaNode(Email()) 

Примечание форма валидатор вызывается только тогда, когда ни одно из отдельных валидаторов полей не вызовет ошибку.

+0

Это решение не работает, когда вы связываете MySchema к форме в целях т.е. deform.Form (MySchema(). Bind(), кнопки = ('Submit', 'Отменить'),. ...). Решение Тима Хоффмана работает и стоит щелкнуть, поскольку он предлагает просто передать параметр ключевого слова вместо переопределения метода. –

3

Чтобы разместить валидатор для всех полей дуршлаг мы можем просто сделать этот метод

валидатор:

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): 
    #Here you can provide validator method as a parameter. And you can validate any field you want. 
    schema = UserSchema(validator = user_DoesExist).bind(request=self.request) 
    form = deform.Form(schema, action=self.request.route_url('add_user'), buttons=('Add User','Cancel')) 

Исправьте меня, если я ошибаюсь в своем сценарии.

Благодаря

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