Formencode模式内的复合验证器

时间:2014-05-09 15:20:12

标签: python validation formencode

我试图做一些我认为应该直截了当的事情,但我遇到了让它发挥作用的问题。这就是我现在所拥有的,它按预期工作。

some_schema = Schema(

   multiples = ForEach(UnicodeString(), convert_to_list=True),
   single = OneOf(['a', 'b'])

)

我想要做的是在将多值字段转换为unicode字符串列表后,在多值字段上应用MaxLength验证器。但是,它似乎不喜欢我使用复合(例如,All,Pipe)或自定义验证器的任何尝试。在我看来,这是实现这一目标最直接的方式。

some_schema = Schema(

   multiples = All(MaxLength(5), ForEach(UnicodeString(), convert_to_list=True)),
   single = OneOf(['a', 'b'])

)

根据文档,多值字段应该转换为unicode字符串列表,然后通过MaxLength验证器运行,如果它是>则失败。 5个要素。失败部分有效:

>>> some_schema.to_python({'single':'a', 'multiples': range(6)})
>>> Invalid: multiples: Enter a value less than 5 characters long

然而,一个似乎应该通过的示例实际上失败了:

>>> some_schema.to_python({'single':'a', 'multiples': range(3)})
>>> Invalid: multiples: Please provide only one value

formencode文档尽管通常非常好,却无法阐明这一主题。查看源代码,这是Schema类的单个值预期异常。我尝试将accepts_iterator=True参数传递给Schema,但也失败了。

如何确保模式中的字段是unicode字符串列表并且长度小于N?

1 个答案:

答案 0 :(得分:1)

回答了我自己的问题 - 您必须将accept_iterator关键字提供给MaxLength验证器。

some_schema = Schema(

   multiples = All(MaxLength(5, accepts_iterator=True), ForEach(UnicodeString(), convert_to_list=True)),
   single = OneOf(['a', 'b'])

)

按预期工作。