我有一个空的选择字段,其中包含我在运行时定义的选项:
myfield = SelectField('myfield', validators=[Optional()])
我尝试使用GET请求进行此操作,如下所示:
@app.route('/', methods=['GET'])
def myresponse():
form = myform(csrf_enabled=False)
form.myfield.choices = (('', ''), ('apples', 'apples'), ('pears', 'pears'))
然后当我尝试在空表单上验证时。 (我没有GET参数去myapp.com)
if not form.validate():
return search_with_no_parameters()
else:
return search_with_parameters(form) #this gets run
当我的search_with_parameters函数尝试使用表单变量时,它会检查以确保form.myfield.data
不是Falsey(不是空字符串)。如果它不是Falsey,则使用该参数进行搜索。如果为Falsey,则忽略该参数。但是,在空表单提交中,form.myfield.data
为"None"
字符串。并使用"None"
进行搜索。我可以对"None"
字符串进行验证,但我认为这首先违背了使用此模块的目的。有没有办法让它只返回一个空字符串或真正的None
值?
答案 0 :(得分:7)
我发现添加空字符串的default
参数可以解决问题。
看来这是支持空字符串作为SelectField
的选项/选项所必需的。
示例:
myfield = wtf.fields.SelectField(
u"My Field",
validators=[wtf.validators.Optional()],
choices=[(('', ''), ('apples', 'apples'), ('pears', 'pears'))],
default=''
)
答案 1 :(得分:3)
好的,我为此做了一个解决方法。我在字段中添加了coerce
定义,并将空值从''
更改为0
,如下所示:
myfield = SelectField('myfield', validators=[Optional()], coerce=int)
...
form.myfield.choices = ((0, ''), (1, 'apples'), (2, 'pears'))
当然,这只能起作用,因为我的实际数据是使用整数作为值。如果我的数据是字符串,我不确定这是如何工作的。