要在 WTForms 的 QuerySelectField 中定义默认值,可以直接在字段定义中执行:
my_field = QuerySelectField(
label=u"My Label",
query_factory=lambda: Model.query(...),
get_pk=lambda item: item.id,
get_label=lambda item: item.name,
allow_blank=True,
default=lambda: Model.query.filter(...).one())
然而,它并不像看起来那么简单。考虑到这一点:
- 默认值必须是callable
- 此可调用对象必须返回模型的对象实例(不是其 pk,而是整个对象)
- 仅当没有时才会使用obj or formdata用于初始化表单实例(在这两种情况下,默认值都会被忽略)
在您的情况下,由于您正在使用初始化时手头没有的 obj 属性来初始化默认值,因此您可以改用工厂:
def add_product_form_factory(default_type_name):
class AddProductForm(Form):
title = TextField('Title')
type = QuerySelectField('Type',
query_factory=lambda: ProductType.query.order_by(ProductType.sequence).all(),
default=ProductType.query.filter_by(name=default_type_name).one()
)
return AddProductForm
这里有一个根据参数组成表单的函数(在这种情况下,您不需要默认是可调用的):
AddProductForm = add_product_form_factory(default_type_name='foo')
form = AddProductForm()
附:表单工厂的好处是您可以动态地使用表单,在运行时创建字段或设置选择。