【问题标题】:How to use lists or arrays in Colander forms如何在滤锅表单中使用列表或数组
【发布时间】:2016-02-18 00:44:17
【问题描述】:

如何以 POST 形式发送列表/数组并使用滤锅对其进行解码?我已经尝试了几种方法,但到目前为止没有运气。使用如下形式的表单和滤锅架构将引发错误:[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>

有没有办法做到这一点?

【问题讨论】:

    标签: python colander


    【解决方案1】:

    注意:我已经用通用解决方案更新了这个答案。

    为了将一个 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列表。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      • 2012-08-09
      相关资源
      最近更新 更多