Web2py custom validators

I am new to Web2py and trying to use a special validator.

class IS_NOT_EMPTY_IF_OTHER(Validator): def __init__(self, other, error_message='must be filled because other value ' 'is present'): self.other = other self.error_message = error_message def __call__(self, value): if isinstance(self.other, (list, tuple)): others = self.other else: others = [self.other] has_other = False for other in others: other, empty = is_empty(other) if not empty: has_other = True break value, empty = is_empty(value) if empty and has_other: return (value, T(self.error_message)) else: return (value, None) 

I do not understand how to use it on my table:

 db.define_table('numbers', Field('a', 'integer'), Field('b', 'boolean'), Field('c', 'integer') 

I want to use this so that c does not stay black when b is marked.

+4
source share
1 answer

save code to /modules/customvalidators.py

 from gluon.validators import is_empty from gluon.validators import Validator class IS_NOT_EMPTY_IF_OTHER(Validator): def __init__(self, other, error_message='must be filled because other value ' 'is present'): self.other = other self.error_message = error_message def __call__(self, value): if isinstance(self.other, (list, tuple)): others = self.other else: others = [self.other] has_other = False for other in others: other, empty = is_empty(other) if not empty: has_other = True break value, empty = is_empty(value) if empty and has_other: return (value, T(self.error_message)) else: return (value, None) 

then in /db.py models

 from customvalidator import IS_NOT_EMPTY_IF_OTHER db.define_table("foo", Field('a', 'integer'), Field('b', 'boolean'), Field('c', 'integer') ) # apply the validator db.foo.c.requires = IS_NOT_EMPTY_IF_OTHER(request.vars.b) 

Also, note that this can be done easily without the above validator. Forget all the above code and try this simplified way

Version 2:

 controllers/default.py def check(form): if form.vars.b and not form.vars.c: form.errors.c = "If the b is checked, c must be filled" def action(): form = SQLFORM(db.foo) if form.process(onvalidation=check).accepted: response.flash = "success" return dict(form=form) 
+8
source

All Articles