gpt4 book ai didi

python - WTForms:我似乎无法动态地为 QuerySelectField 提供默认值

转载 作者:行者123 更新时间:2023-11-28 19:45:25 25 4
gpt4 key购买 nike

我有一个看起来像这样的表格:

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)

如您所见,我试图将其设置为在加载表单时为 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())

然而,它并没有看起来那么简单。考虑到这一点:

  • 默认值必须是可调用
  • 此可调用对象必须返回模型的一个对象实例(不是它的 pk,而是整个对象)
  • 只有在没有使用 objformdata 来初始化表单实例时才会使用它(在这两种情况下,默认值都被忽略)

在您的情况下,由于您正在使用初始化时手头没有的 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()

附言。表单工厂的好处是您可以在运行时动态地处理表单、创建字段或设置选项。

关于python - WTForms:我似乎无法动态地为 QuerySelectField 提供默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10046808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com