【问题标题】:Impreratively creating sequence of mapping schemas in Colander and Deform在 Colander 和 Deform 中创建映射模式序列
【发布时间】:2015-05-19 16:01:50
【问题描述】:

我正在构建一个页面,用户可以在其中对 Colander 和 Deform 中的任意数量的产品进行评论。我已经掌握了所有必需的元素,但我仍然有一些连接点的问题。具体来说,我如何强制(动态地)创建一个包含 N 个表单项的序列,然后为它们绑定数据?

这是我迄今为止的尝试:

reviews =[
        {
            "product": "Shampoo",
            "comment": ""
            "rating": 3,
        },

        {
            "product": "Soap",
            "comment": "",
            "rating:" 3,
        },
    ]

rating = colander.Schema()
rating.add(colander.SchemaNode(colander.Int(), name="rating", missing=colander.null, validator=colander.Range(1, 5)))
rating.add(colander.SchemaNode(colander.String(), name="comment", validator=colander.Length(max=4096), missing=""))
ratings = colander.SequenceSchema(name="ratings", default=reviews, children=[rating])

# schema.add(colander.SchemaNode(colander.Sequence(), rating, name="ratings", default=reviews))
schema = CSRFSchema()
schema.add(ratings)

form = deform.Form(schema)
if request.method == "POST":
    controls = request.POST.items()

    try:
        captured = form.validate(controls)
    except deform.ValidationFailure as e:
        return {'form': e.render()}
else:
    rendered_form = form.render()

return locals()

但这会导致错误:

ValueError: Prototype for <deform.field.Field object at 4576735072 (schemanode 'ratings')> has no name

【问题讨论】:

  • 请修复代码高亮问题

标签: deform colander


【解决方案1】:

好的 - 想通了。必须命名最里面的SchemaNode()。必须使用colander.SchemaNode(colander.Sequence()) 来绘制项目序列。

reviews =[
        {
            "product": "Shampoo",
            "comment": "",
            "rating": 3,
        },

        {
            "product": "Soap",
            "comment": "",
            "rating": 3,
        },
    ]

rating = colander.Schema(name="single_rating")
rating.add(colander.SchemaNode(colander.Int(), name="rating", missing=colander.null, validator=colander.Range(1, 5)))
rating.add(colander.SchemaNode(colander.String(), name="comment", validator=colander.Length(max=4096), missing=""))
ratings = colander.SchemaNode(colander.Sequence(), rating, name="ratings", default=reviews)

# schema.add(colander.SchemaNode(colander.Sequence(), rating, name="ratings", default=reviews))
schema = CSRFSchema()
schema.add(ratings)

form = deform.Form(schema)
if request.method == "POST":
    controls = request.POST.items()

    try:
        captured = form.validate(controls)
    except deform.ValidationFailure as e:
        return {'form': e.render()}
else:
    rendered_form = form.render()

return locals()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-01
    • 2023-04-08
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 2016-03-01
    相关资源
    最近更新 更多