oli*_*ive 2 python sqlalchemy flask wtforms
我有一个看起来像这样的表单:
class AddProductForm(Form):
title = TextField('Title')
type = QuerySelectField('Type',
query_factory=lambda: ProductType.query.order_by(ProductType.sequence).all())
def __init__(self, formdata=None, obj=None, prefix='', **kwargs):
try:
product_type_id = ProductType.query.filter_by(name=obj['product_type']).one().product_type_id
kwargs.setdefault('type', product_type_id)
except NoResultFound:
pass
Form.__init__(self, formdata, obj, prefix, **kwargs)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我正在尝试将其设置为在加载表单时为product_type提供合理的默认值.但是,虽然这种代码用于设置标题作为示例,但它不适用于QuerySelectField的"类型".有没有人有任何想法我怎么能解决这个问题?
假设这是不可能的,有人知道如何动态地向表单添加表单元素吗?
要在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())
Run Code Online (Sandbox Code Playgroud)
然而,它比它看起来简单一点.考虑到这一点:
在您的情况下,由于您使用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
Run Code Online (Sandbox Code Playgroud)
这里有一个函数根据参数组成表单(在这种情况下,您不需要默认值是可调用的):
AddProductForm = add_product_form_factory(default_type_name='foo')
form = AddProductForm()
Run Code Online (Sandbox Code Playgroud)
PS.表单工厂的好处是您可以在运行时动态处理表单,创建字段或设置选项.
| 归档时间: |
|
| 查看次数: |
2666 次 |
| 最近记录: |