С помощью валидаторов Python Formencode существуют ключи с требованием RequireIfMissing и RequireIfPresent, которые допускают требования, учитывая состояние других полей, находящихся там или нет. Кажется, что он работает только для отдельных полей, если одно поле отсутствует, требуется другое или если присутствует одно поле, требуется другое. Как требуется хотя бы одно из многих полей?Как проверить, что по крайней мере одно поле присутствует в нескольких экземплярах с помощью formencode?
0
A
ответ
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({})