如何使用formencode验证器验证至少有一个字段存在多个字段?

时间:2015-08-26 22:35:40

标签: python validation formencode

使用Python Formencode验证器,有chained_validators RequireIfMissing和RequireIfPresent,允许在给定其他字段的状态或不存在的情况下的要求。它似乎只适用于单个字段,这意味着如果缺少一个字段,需要另一个字段或者如果存在一个字段,则需要另一个字段。一个人如何至少需要一个领域?

1 个答案:

答案 0 :(得分: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({})