根据您的问题,很难确定您使用的是WTForms 还是Flask-WTF。文档链接指向前者,而您的示例使用 FlaskForm 类,后者是后者的一部分。
以下简约示例是使用 WTForms 制作的。
项目结构:
your_project_folder
├───forms
│ ├───__init__.py
│ └───dynamic_form.py
├───templates
│ └───main.html
├───venv
│ └───your_virtual_environment_files
└───server.py
dynamic_form.py 包含没有表单实例化的包装函数(它只返回动态创建的表单类):
from wtforms import Form, BooleanField
def wrapper_func(list_a):
class Prefs(Form):
pass
for ele in list_a:
setattr(Prefs, ele, BooleanField(ele))
return Prefs
main.html 包含使用 Jinja2 语法生成表单的 HTML 代码:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<form method="POST">
{% for field in form %}
<div>{{ field.label }}: {{ field }}</div>
{% endfor %}
<button type="submit">Submit</button>
</form>
</body>
</html>
server.py 将所有内容放在一起:
from flask.app import Flask
from flask import request, render_template, redirect
from forms.dynamic_form import wrapper_func
app = Flask('form_app')
@app.route('/', methods=['GET', 'POST'])
def main():
input_list = ['one', 'two', 'three'] # generate it as needed
prefs = wrapper_func(input_list)
form = prefs(request.form)
if request.method == 'POST' and form.validate():
# do your logic with the submitted form data here
return redirect('/')
return render_template("main.html", form=form)
if __name__ == '__main__':
app.run(host='localhost', port=3456, debug=True)
最后两行仅用于开发目的!
如果这个例子有帮助,请告诉我!