我理解WTForms中的SelectField
方法可以使用具有以下形式的参数choices
...
choices=[("value1", "display of value 1"), ("value2", "display of value 2")]
我需要根据对数据库的调用来填充我的选择。我使用neo4j作为我的后端,所以我不能使用modelforms或其他内置解决方案来填充表单中的数据。
def get_list_of_things():
query = 'start n = node:things("*:*") return ID(n), n.display_name;'
t = cypher.execute(cdb, query)[0]
for x in t:
x[0] = str(x[0])
x[1] = str(x[1])
things = list(tuple(x) for x in t)
return things
class SelectAThing(Form):
thingID = SelectField('Thing name', choices=get_list_of_things())
运行选项= get_list_of_things()确实会产生一个有效的选择列表,很棒,这基本上可行。
但是,即使数据库存在,也似乎永远不会更新事物列表,我稍后会返回该表单。如果我向db添加内容并返回,我仍然会看到第一个列表。
答案 0 :(得分:6)
顺便说一句,如果您从SQLAlchemy数据库中选择(并且您使用的是Flask),请查看QuerySelectField插件:
http://wtforms.simplecodes.com/docs/0.6.1/ext.html#module-wtforms.ext.sqlalchemy
from wtforms.ext.sqlalchemy.fields import QuerySelectField
def all_employees():
return Employee.query
class BugReportForm(Form):
description = TextField(u"Notes")
# The get_label will show the "name" attribute of the Employee model
assign_to = QuerySelectField(u'Assign to',
get_label=u"name",
query_factory=all_employees)
那将为您提供一个包含每个人姓名的选择字段。
Bonus:当您在视图代码中访问BugReportForm.assign_to.data时,它将返回Employee对象(而不是id)。它很方便。
答案 1 :(得分:4)
没有假人,只是不要把它放在课堂上。把它放在视图代码中。
@app.route('/route')
def routename()
form = SelectAThing()
form.orgid.choices=get_joinable_orgs()
我发现这很棘手,因为我没有意识到我可以在视图中初始化之后将其分配给表单,就像它是一个普通的python对象。