我有一个
Form
,其中包含一个SelectField
,如下所示:
CHOICES = [
('A', 'Apple'),
('B', 'Ball'),
('C', 'Cat'),
]
class MyForm(Form):
choice = SelectField(choices=CHOICES)
# ...other fields here... #
当我渲染表单时,它显示默认选择“Apple”的 SelectField。但我希望一开始就什么都不选择,这样用户就被迫自己做出选择。
有没有办法呈现一个空白选择,默认情况下显示,但提交表单后就不是有效的选择?
值为
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
(类型无类型)。
我无法告诉你作者为什么将
Apple
作为默认值,因为 SelectField
的默认值是 None
。但还有另一个问题 - 它实际上不是 None
,而是 'None'
(作为字符串)。
这种奇怪的行为已在here和here讨论过,似乎没有解决方案。
我的解决方法是使用
__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}
认为,这可能对某人有帮助。