Как проверить, что хотя бы одно поле присутствует из нескольких с валидаторами formencode?
В валидаторах Python Formencode есть chained_validators RequireIfMissing и RequireIfPresent, которые учитывают требования с учетом состояния других полей, находящихся там или нет. Кажется, он работает только для отдельных полей, то есть, если одно поле отсутствует, требуется другое или если одно поле присутствует, требуется другое. Как требуется хотя бы одно из множества полей?
1 ответ
Класс ниже: RequireAtLeastOne будет принимать список полей и будет проходить, только если присутствует хотя бы одно из полей, как продемонстрировано с успехами и неудачами внизу.
from formencode import Schema, validators, Invalid
from formencode.validators import FormValidator
class RequireAtLeastOne(FormValidator):
choices = []
__unpackargs__ = ('choices',)
def _convert_to_python(self, value_dict, state):
for each in self.choices:
if value_dict.get(each) is not None:
return value_dict
raise Invalid('You must give a value for %s' % repr(self.choices), value_dict, state)
class ValidateThings(Schema):
field1 = validators.String(if_missing=None)
field2 = validators.String(if_missing=None)
field3 = validators.String(if_missing=None)
chained_validators = [RequireAtLeastOne(['field1', 'field2', 'field3'])]
""" Success """
params = ValidateThings().to_python({"field2": 12})
params = ValidateThings().to_python({"field2": 12, "field3": 126})
params = ValidateThings().to_python({"field1": "foo", "field2": 12, "field3": 126})
""" Failure """
params = ValidateThings().to_python({})