Flask-WTF动态选择字段给出"无"作为一个字符串

时间:2016-02-17 15:03:40

标签: wtforms flask-wtforms

我有一个空的选择字段,其中包含我在运行时定义的选项:

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值?

2 个答案:

答案 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'))

当然,这只能起作用,因为我的实际数据是使用整数作为值。如果我的数据是字符串,我不确定这是如何工作的。