В обязательном порядке создание последовательности картографических схем в Colander и Deform

Я создаю страницу, на которой пользователь может оставлять отзывы о любом количестве продуктов в 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

person Mikko Ohtamaa    schedule 17.05.2015    source источник
comment
пожалуйста, исправьте подсветку кода   -  person Sascha Gottfried    schedule 19.05.2015


Ответы (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()
person Mikko Ohtamaa    schedule 17.05.2015