I wrote a small python library required to make cross-field validation like this easier. You can encode your validation logic declaratively as pairwise dependencies. So your form may look like:
from required import R, Requires, RequirementError
class MyForm(Form):
VALIDATION = (
Requires("select1", R("select1") != R("select2") +
Requires("select2", R("select2") != R("select3") +
Requires("select3", R("select3") != R("select1")
)
select1 = SelectField('Select 1', ...)
select2 = SelectField('Select 2', ...)
select3 = SelectField('Select 3', ...)
def validate(self):
data = {
"select1": self.select1.data,
"select2": self.select2.data,
"select3": self.select3.data,
}
# you can catch the RequirementError
# and append the error message to
# the form errors
self.VALIDATION.validate(data)
return result
You can take the VALIDATION object and append more validation rules or even put it in a separate module and import / reuse validation rules in different places.
if not Form.validate(self):
? That keeps firing when I try your suggestion and the validation doesn't run. – Morehead