How do I validate wtforms fields against one another? How do I validate wtforms fields against one another? flask flask

How do I validate wtforms fields against one another?


You can override validate in your Form...

class MyForm(Form):    select1 = SelectField('Select 1', ...)    select2 = SelectField('Select 2', ...)    select3 = SelectField('Select 3', ...)    def validate(self):        if not Form.validate(self):            return False        result = True        seen = set()        for field in [self.select1, self.select2, self.select3]:            if field.data in seen:                field.errors.append('Please select three distinct choices.')                result = False            else:                seen.add(field.data)        return result


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, RequirementErrorclass 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.


You can use the form in your validation to get the value of other fields.

For example:

def validate_name(form, field):    if form.other_variable.data == 'checked' and len(field.data) > 10:        raise validation_error("say somgthing")