<h2>发行</h2>
<p>WTForms不支持在类级别的字典属性中定义字段。<a href="https://github.com/wtforms/wtforms/blob/master/src/wtforms/form.py" rel="nofollow noreferrer">Form</a>基类使用FormMeta(来自同一个文件)作为元类来标识类定义中未绑定的WTForm字段并将它们绑定到当前表单,这只会发现类级别的属性。在</p>
<h2>解决方案</h2>
<p>下面是一个使用表单工厂函数的最小工作示例。在</p>
<p>额外的表单字段通过<code>field_factory</code>参数作为lambda函数传入,这样我们就可以延迟额外字段的创建,直到创建<code>name</code>字段之后(尽管任何返回dict的可调用函数都可以工作)。这是必需的,因为WTForms按创建顺序而不是按在<code>make_form()</code>函数内的<code>items</code>dict中提供的顺序对字段进行排序。在</p>
<p>然后,可以通过迭代表单而不是指定手动顺序来呈现它们。在</p>
<p>在python3.7.1上测试。在</p>
<pre><code>from flask import Flask
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired
app = Flask(__name__)
app.config['SECRET_KEY'] = "secret"
def make_form(field_factory, name="MyForm"):
items = dict(name=StringField('New Name', validators=[DataRequired()]),
**field_factory())
my_form = type(name, (FlaskForm,), items)
return my_form
if __name__ == "__main__":
with app.test_request_context("/"):
my_form = make_form(field_factory=lambda: dict(
Field1=StringField('Field 1', validators=[DataRequired()]),
Field2=StringField('Field 2', validators=[DataRequired()])
))
form = my_form()
for field in form:
print(field())
</code></pre>
<p>输出</p>
^{pr2}$