如何为WTForms SelectField设置默认值?

jan*_*jan 41 python flask wtforms

当尝试使用WTForms设置SelectField的默认值时,我将值传递给'default'参数,就像这样.

class TestForm(Form):
  test_field = SelectField("Test: ", choices=[(1, "Abc"), (2, "Def")], default=2)
Run Code Online (Sandbox Code Playgroud)

我也试过以下.

class TestForm(Form):
  test_field = SelectField("Test: ", choices=[(1, "Abc"), (2, "Def")], default=(2, "Def"))
Run Code Online (Sandbox Code Playgroud)

既不将默认的选定字段设置为"Def".这适用于其他类型的字段,如TextField.如何设置SelectField的默认值?'

Ell*_*t C 35

我相信这个问题是由引起Fielddata属性重写default的东西,WTForms不理解(如数据库模型对象-它期望的int).如果你在构造函数中填充了表单,就会发生这种情况:

form = PostForm(obj=post)
Run Code Online (Sandbox Code Playgroud)

解决方案是data在填充表单后手动设置属性:

form = PostForm(obj=post)
form.category.data = (post.category.id
                      if page.category
                      else 0) # I make 0 my default
Run Code Online (Sandbox Code Playgroud)

  • 在运行时从视图动态填充选择时,这是使默认情况下具有一个选择的正确方法。由于Google带来了很多人对此问题的解答,因此这应该是公认的答案。 (3认同)
  • 好吧,我注意到当我从视图中的列表中更改另一个默认选项并提交表单时,将提交默认选项而不是新选项.如何解决这个问题? (3认同)

sp.*_*sp. 29

你发布的第一种方式是正确的,它对我有用.它不起作用的唯一解释是你运行的是旧版本的WTForms,它在1.0.1上适用于我

  • 请注意,对于`SelectMultipleField`,默认值必须是一个列表,即:`default=[2]`。 (3认同)

get*_*up8 14

有几种方法可以做到这一点.您的第一个代码段确实是正确的.

如果您想在动态视图中执行此操作,您还可以执行以下操作:

form = TestForm()
form.test_field.default = some_default_id
form.process()
Run Code Online (Sandbox Code Playgroud)


小智 14

Flask-WTF 0.14.2用户在这里.所以这个答案适用于任何与我有类似问题的人.

基本上,以前的解决方案都没有正常运行form.validate_on_submit().

设置form.test_field.data确实会改变默认值加载页面时,但该数据保持不变validate_on_submit(在浏览器用户的变化没有影响).

设置form.test_field.default然后调用form.process()也会在页面加载时更改值,但validate_on_submit会失败.

这是实现它的新方法:

class TestForm(Form):
    test_field = SelectField("Test", choices=[(0, "test0"), (1, "test1")])

@app.route("/test")
def view_function():
    form = TestForm(test_field=1)
    if form.validate_on_submit():
    ...
Run Code Online (Sandbox Code Playgroud)


Liu*_*Yue 6

这是一个choices使用SelectField时的设置int,它的工作方式如下:

test_select = SelectField("Test", coerce=int, choices=[(0, "test0"), (1, "test1")], default=1)
Run Code Online (Sandbox Code Playgroud)

要么:

class TestForm(Form):
    test_select = SelectField("Test", coerce=int)

@app.route("/test")
def view_function():
    form = TestForm()
    form.test_select.choices = [(0, "test0"), (1, "test1")]
    form.test_select.default = 1
    form.process()
Run Code Online (Sandbox Code Playgroud)