3

リスト/配列を 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>

これを行う方法はありますか?

4

1 に答える 1

3

注:一般化されたソリューションでこの回答を更新しました。

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して、通常の Colander と同様に、任意のタイプのを作成できSequenceSchemaます。

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

これは、文字列 (例: ) を受け取り、?ages=23,13,42それを python リストに解析します。

うまくいけば、これは同じ問題を抱えている他の人の助けになります。

于 2015-09-21T18:38:34.940 に答える