Jak zdefiniować niestandardowy weryfikator w Deform/Colander, który ma dostęp do wszystkich wartości węzłów pod numerami . Muszę uzyskać dostęp do wartości z dwóch pól, aby zdecydować, czy dana wartość jest ważna czy nie?Walidator Deform/Colander, który ma dostęp do wszystkich węzłów?
8
A
Odpowiedz
3
Oto przykład sprawdzania poprawności międzyfazowej. http://deformdemo.repoze.org/interfield/
2
namacalnie odpowiedź brzmi:
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())
Uwaga walidator forma jest wywoływana tylko wtedy, gdy żaden z poszczególnych walidatorami polowych zgłosi błąd.
3
Aby umieścić walidatora dla wszystkich pól durszlak możemy po prostu zrobić z tej metody
validator:
def user_DoesExist(node,appstruct):
if DBSession.query(User).filter_by(username=appstruct['username']).count() > 0:
raise colander.Invalid(node, 'Username already exist.!!')
Schema:
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')
Widok:
@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'))
Popraw mnie, jeśli się mylę w moim scenariuszu.
Dzięki
To rozwiązanie nie działa, gdy powiąże moj_schemat do formularza w widoku tj deform.Form (moj_schemat(). Bind(), przyciski = ('Wyślij', 'Anuluj'). ...). Rozwiązanie Tim Hoffmana działa i jest warte kliknięcia, ponieważ proponuje zastąpienie parametru słowa kluczowego zamiast przesłonięcia metody. –