如何在Colander表单中使用列表或数组

时间:2015-09-17 10:06:45

标签: python colander

如何在POST表单中发送列表/数组并使用Colander进行解码?我已经尝试了几种方法但到目前为止没有运气。使用如下所示的表单和Colander架构将引发错误:[1,2,3] is not iterable

example_1.html:

<form action="path_to_page" method="post">
  <input name="ids" type="text" value="[1,2,3]">
  <input type="submit">
</form>

example_1.py:

class IDList(colander.List):
    item = colander.SchemaNode(colander.Integer())

class IDS(colander.MappingSchema):
    ids = colander.SchemaNode(IDList())

而另一种方法根本无法工作,因为我们无法创建一个名为ids[]的漏勺节点。

example_2.html:

<form action="path_to_page" method="post">
  <input name="ids[]" type="text" value="1">
  <input name="ids[]" type="text" value="2">
  <input name="ids[]" type="text" value="3">
  <input type="submit">
</form>

有没有办法完成这项工作?

1 个答案:

答案 0 :(得分:2)

注意:我已使用通用解决方案更新了此答案。

为了将一个URI字符串解析为可用的Colander列表以进行反序列化,您可以创建一个继承Colander的SquenceSchema的新类,并覆盖相应的deserialize方法以将逗号分隔的字符串拆分为一个Python列表:

class URISequenceSchema(SequenceSchema):
    def deserialize(self, cstruct):
        if cstruct:
            cstruct = cstruct.split(',')
        return super(URISequenceSchema, self).deserialize(cstruct)

然后,您可以使用此新类创建任何类型的SequenceSchema,就像使用普通滤网SequenceSchema一样:

FooSequence(URISequenceSchema):
    foo = SchemaNode(Integer(), validator=Range(min=0))

这将接受一个字符串(例如?ages=23,13,42)并将其解析为python列表。

希望这可以帮助其他遇到同样问题的人。