想通过用户输入的数字如“5”,动态创建含有 5 个用户ID输入框的表单。想了几种实现方法都遇到了问题。
1.如果在视图函数中循环创建表单的5个实例,在渲染模版时 如何渲染指定数量的表单作为参数?
2.表单定义时根据用户输入的数字进行动态创建。看了flask-wtf 依然不清楚如何实现。
可以在视图函数里动态生成表单:
from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import StringField
# ...
@app.route('/test')
def test():
class DynamicForm(FlaskForm):
pass
for i in range(0, 5):
setattr(DynamicForm, 'form-' + str(i), StringField(i))
form = DynamicForm()
return render_template('index.html', form=form)
setattr()函数的三个参数分别是表单类(对象)、字段名(属性名)、字段值(属性值)。
你需要把range()中的5替换成代表用户输入值的变量。
渲染的方式和创建字段很相似,即使用for循环迭代所有字段:
<form method="POST">
{% for field in form if field.widget.input_type != 'hidden' %}
{{ field.label }}{{ field }}<br>
{% endfor %}
</form>
Flask-WTF集成了WTForms,添加了一些辅助函数。但具体的实现要参考WTForms的文档,这里有关于动态表单的说明:WTForms Documentation
更进一步,使用FieldList(WTForms Documentation)类,配合JavaScript,你可以在页面上添加一个“添加输入框”按钮,动态的增加字段。