【问题标题】:Setting default value after initialization in SelectField flask-WTForms在 SelectField flask-WTForms 中初始化后设置默认值
【发布时间】:2016-07-09 12:22:34
【问题描述】:

我想在向用户显示 SelectField 时预先选择它的值。 default 参数在实例化时传递时有效,但在字段初始化后无效。

class AddressForm(Form):
    country = SelectField('Country',choices=[('GB', 'Great Britan'), ('US', 'United States')], default='GB')    # works

当我尝试在将表单呈现给用户进行编辑之前使用default 值预选选项时,它不起作用。

address_form = AddressForm()
address_form.country.default='US'    # doesnot work

在呈现给用户之前需要一种解决方案,将默认值设置为预设值。

场景 2:也行不通

class AddressForm(Form):
        country = SelectField('Country')    # works

address_form = AddressForm()
address_form.country.choices=[('GB', 'Great Britan'), ('US', 'United States')]
address_form.country.default='US'    # doesnot work

【问题讨论】:

    标签: python flask wtforms


    【解决方案1】:

    一旦创建了表单实例,数据就会被绑定。之后更改默认值不会做任何事情。更改 choices 起作用的原因是因为它会影响验证,直到调用 validate 才会运行。

    将默认数据传递给form constructor,它将被使用if no form data was passed。默认会第一次呈现,如果用户不改变值,则第二次发布。

    form = AddressForm(request.form, country='US')
    

    (如果您使用的是 Flask-WTF 的 Form,则可以省略 request.form 部分。)

    【讨论】:

      【解决方案2】:

      我知道您可能已经解决了这个问题。但我认为它不再起作用了。因为这是在谷歌搜索问题时出现的第一件事,所以我想给有这个问题的人一个可行的解决方案(至少对我来说)。

      要确认默认选择的更改,我们必须添加address_form.process() . 就是这样!

      完整的解决方案是:

      class AddressForm(Form):
              country = SelectField('Country')    # works
      
      address_form = AddressForm()
      address_form.country.choices=[('GB', 'Great Britan'), ('US', 'United States')]
      address_form.country.default='US'
      address_form.process()    # works
      

      【讨论】:

      • 这太棒了,谢谢分享!需要注意的一件事是,例如,如果您在渲染时通过手动设置 address_form.state.data = 'CA' 来预填充表单,则 process() 方法将清除您的手动设置。在手动设置任何其他输入值之前,您必须更新下拉默认值和调用过程。
      • 这对我有用,但删除了此处描述的 CSRF 保护:stackoverflow.com/a/64155651/4204032。有解决办法吗?
      【解决方案3】:
      class AddressForm(Form):
          country = SelectField('Country')    # works
      
      address_form = AddressForm()
      address_form.country.choices=[('GB', 'Great Britan'), ('US', 'United States')]
      address_form.country.default='US'
      address_form.process()
      

      此方法也显示默认值,但是当我提交表单时未提交,验证的方法正常工作

      【讨论】:

      • 由于某种原因,当我尝试此操作时,我收到一条错误消息,提示“process() 缺少 1 个必需的位置参数:'formdata'”。这是因为我的表单是 FlaskForm 而不仅仅是表单吗?
      猜你喜欢
      • 2021-04-07
      • 2019-02-21
      • 2012-08-19
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多