0

我希望最终使用 db.stringListProperty() 对用户的输入进行建模。如果可能的话,输入格式应该是什么样子?如何构建用户的输入(使用 []、引号、逗号等)?我将 jinja2 用于表单模板,如果这很重要的话。(如何验证数据输入正确的额外功劳。)谢谢。

我从 appengine 收到此错误。

raise BadValueError('Property %s must be a list' % self.name)
BadValueError: Property choices must be a list

错误发生在下面的这一行。

person.choices = self.request.get('choices')

class PQ(db.Model):
    choices = db.StringListProperty()


    key = db.Key.from_path("PQ", ID_id)
    person = PQ.get(key)
    template_values = {'ID_id':person.key(),
                      'p': person,
                      }
    path = os.path.join(TEMPLATE_DIR, 'add_person.html')
    self.response.out.write(template.render(path, template_values))


class AddPerson(BaseHandler):
    def post(self):
        ID_id = self.request.get('ID')
        key = db.Key.from_path("PQ", ID_id)
        person = PQ.get(key)

        person.choices = self.request.get('choices')
        person.put()
        self.redirect("/?ID=%s" % ID_id)



add_person.html
<html>
  <body>

<div id="inputdata">
    <form action="add_person" method="post" enctype="multipart/form-data">
        <label>Enter your list of choices. Your list must follow this format:
            ["Less","Same","More"] </label>
    <input type="textbox" name="choices" size="30" value="{{ p.choices }}"></input><br/>
    <input type="submit" value="Submit"></input>
    </form>
</div>
    </body>
</html>
4

1 回答 1

0

似乎您收到此错误是因为choices必须是列表类型,但您从请求中获得的值是一个字符串 - 并且永远都是,因为您是从 HTTP 请求中获得的。

在表单方面,用户输入数据的格式并不重要,因为它总是作为字符串传递——一个逗号分隔的列表就足够了。然后你可以用 eg 解析它self.request.get('choices').split(",")(并修剪你身边的空白,这样你就不会因为确切的空白要求而打扰用户)。

最佳实践要求您应该尽可能地帮助用户 - 如果您有一组预定义的选择,您可以使用Select2或类似的小部件来指导用户进行选择。

于 2012-06-29T20:03:32.207 回答