我正在尝试使用WTForms创建动态下拉列表(SelectField)。我已经阅读了文档,并在堆栈上查看了很多答案,所有示例都涉及对数据库查询的迭代。
我只是想遍历一个列表(由外部API调用生成)以注入SelectField选项。例如:
class ToolForm(FlaskForm):
myField3 = SelectField(u'Select Account', choices=[], coerce=int)
@app.route("/test", methods=['GET', 'POST'])
def test():
form = ToolForm()
accounts5 = []
if request.method == 'POST':
if request.form['submit_button'] == 'Select Account':
#code that generates list called "accounts5"
acctchoices = [(c.id,c.name) for c in accounts5]
form.myField3.choices = acctchoices
return render_template('test.html', title='test', form=form, accounts5=accounts5)
我的相关HTML看起来像:
<div class="form-group">
{{ form.myField3.label(class="form-control-label") }} {% if form.myField3.errors %} {{
form.myField3(class="form-control form-control-lg is-invalid") }}
<div class="invalid-feedback">
{% for errors in form.myField3.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %} {{ form.myField3(class="form-control form-control-lg") }} {% endif %}
</div>
<form action="http://127.0.0.1:5000/test" method="post">
<input type="submit" class="btn btn-outline-info" name="submit_button" value="Select Account">
</form>
当我单击“选择帐户”时,出现'int' object has no attribute 'id'
错误。我以为这可能是数据类型问题,所以我尝试了一个字符串列表,但无济于事。
我的问题是,如何从列表中填充SelectField?
当您GET
该路线时,它将加载通用的表单并将其呈现到页面上,而没有设置或可用任何myField3
选项。
您可以通过使用__init__
替代控制基于某些条件加载的表单:
class ToolForm(FlaskForm):
myField3 = SelectField(u'Select Account', choices=[], coerce=int)
def __init__(self, accounts=None):
super().__init__() # calls the base initialisation and then...
if accounts:
self.myField3.choices = [(c.id, c.name) for c in accounts]
然后,您将根据路线请求从其他信息构造表格:
@app.route("/test", methods=['GET', 'POST'])
def test():
# define accounts
form = ToolForm(accounts=accounts)