2

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

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?

4

1 回答 1

1

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

some_schema = Schema(

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

)

按预期工作。

于 2014-05-09T16:01:10.173 回答