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') )
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)
source share