我希望用户的输入最终使用 db.stringListProperty() 建模。如果可能的话,输入格式必须是什么样子,用户的输入必须如何构造(用 []、用引号、用逗号等)?如果这很重要,我正在使用 jinja2 作为表单模板。(有关如何验证数据是否正确输入的额外学分。谢谢。
我从应用程序引擎收到此错误。
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>
您似乎会收到此错误choices
因为它必须是列表类型,但您从请求中获取的值是一个字符串 - 并且始终如此,因为您从 HTTP 请求中获取它。
在表单端,用户以何种格式键入数据并不重要,因为它始终作为字符串传递 - 逗号分隔的列表就足够了。然后你可以用例如 self.request.get('choices').split(",")
(并修剪您这边的空格,这样您就不会用确切的空格要求打扰用户)。
最佳实践要求您应该尽可能多地帮助用户 - 如果您有一组预定义的选择,则可以使用 Select2 或类似的小部件来指导用户进行选择。