【问题标题】:WTForms: I can't seem to dynamically give a QuerySelectField a default valueWTForms:我似乎无法动态地给 QuerySelectField 一个默认值
【发布时间】:2012-04-20 06:25:29
【问题描述】:

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

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“类型”。有人知道我该如何解决这个问题吗?

假设这是不可能的,有谁知道我如何动态地将表单元素添加到表单中?

【问题讨论】:

  • 你好,这个问题你解决了吗?

标签: python sqlalchemy flask wtforms


【解决方案1】:

要在 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()

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

【讨论】:

  • 感谢指出:“只有在没有使用obj或formdata初始化表单实例时才会使用(在这两种情况下,默认值都被忽略)”
  • 哇,我花了一整天的时间才弄清楚这个:stackoverflow.com/q/57863668/8070090,你太棒了,非常感谢,伙计:)
  • @GofyanandKitty 不客气。很高兴它有帮助。我被它咬了好几次,直到我弄清楚发生了什么......
【解决方案2】:

使用以下参数:

QuerySelectField(allow_blank=True, blank_text=u'-- please choose --', ...)

可以添加默认选择选项

【讨论】:

  • 这正是我所需要的
猜你喜欢
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多