使 SelectField 默认不选择任何内容

问题描述 投票:0回答:2

我有一个

Form
,其中包含一个
SelectField
,如下所示:

CHOICES = [
    ('A', 'Apple'),
    ('B', 'Ball'),
    ('C', 'Cat'),
]

class MyForm(Form):
    choice = SelectField(choices=CHOICES)
    # ...other fields here... #

当我渲染表单时,它显示默认选择“Apple”的 SelectField。但我希望一开始就什么都不选择,这样用户就被迫自己做出选择。

有没有办法呈现一个空白选择,默认情况下显示,但提交表单后就不是有效的选择?

python flask wtforms html-input
2个回答
2
投票

值为

None
的选项将显示在表单中,但提交后仍然无效。您可以将其设置为默认选项,如下所示:

CHOICES = [
    (None, ''), # <-- This option is invalid when submitted
    ('A', 'Apple'),
    ('B', 'Ball'),
    ('C', 'Cat'),
]

class MyForm(Form):
    choice = SelectField(choices=CHOICES, default=None)
    # ...other fields here... #

default=None
添加到 SelectField 是可选的,因为无论如何这是默认行为。

您还可以向值添加字符串,例如

(None, '--')
(None, 'Please select an option')
。该选项仍然无效。

注意:我怀疑这种行为与 None 对象本身无关,而是因为从表单提交时它被强制为

'None'
(类型 unicode),因此与原始
None
(类型无类型)。


0
投票

我无法告诉你作者为什么将

Apple
作为默认值,因为
SelectField
的默认值是
None
。但还有另一个问题 - 它实际上不是
None
,而是
'None'
(作为字符串)。

这种奇怪的行为已在herehere讨论过,似乎没有解决方案。

我的解决方法是使用

__init__

class MyForm(Form):
    choice = SelectField(choices=CHOICES)
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        
        if self.choice.data == 'None':
            self.choice.data = None
>>> MyForm(choice='Apple').data
{'choice': 'Apple'}
>>> MyForm().data
{'choice': None}

认为,这可能对某人有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.