2015-05-17 10 views
1

Я создаю страницу, на которой пользователь может оставлять отзывы для любого количества продуктов в Colander и Deform. Я взял все необходимые элементы, но у меня все еще есть некоторые проблемы с подключением точек. В частности, как я могу (динамически) создать последовательность из N элементов формы, а затем привязать данные к ним?Впечатляющее создание последовательности схем сопоставления в Colander и Deform

Это моя попытка для этого далеко:

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 
+0

уточняйте код подсветки –

ответ

0

Ok - понял. Самый внутренний 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()