Flask-WTF动态选择字段将"无"作为字符串

use*_*909 7 wtforms flask-wtforms

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

myfield = SelectField('myfield', validators=[Optional()])
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用看起来像这样的GET请求:

@app.route('/', methods=['GET'])
def myresponse():
    form = myform(csrf_enabled=False)
    form.myfield.choices = (('', ''), ('apples', 'apples'), ('pears', 'pears'))
Run Code Online (Sandbox Code Playgroud)

然后当我尝试在空表格上验证时.(我没有GET参数去myapp.com)

    if not form.validate():
        return search_with_no_parameters()
    else:
        return search_with_parameters(form) #this gets run
Run Code Online (Sandbox Code Playgroud)

当我的search_with_parameters函数尝试使用表单变量时,它会检查以确保它form.myfield.data不是Falsey(不是空字符串).如果它不是Falsey,则使用该参数进行搜索.如果为Falsey,则忽略该参数.但是,在空表单提交时,form.myfield.data"None"一个字符串."None"完成搜索.我可以验证"None"字符串,但我认为这首先打败了使用该模块的目的.有没有办法让它只返回一个空字符串或真正的None值?

wod*_*dow 8

我发现添加default空字符串的参数可以解决问题.

看来这是支持空字符串作为选项/选项的必要条件SelectField.

例:

myfield = wtf.fields.SelectField(
    u"My Field",
    validators=[wtf.validators.Optional()],
    choices=[(('', ''), ('apples', 'apples'), ('pears', 'pears'))],
    default=''
)
Run Code Online (Sandbox Code Playgroud)

  • 必须这样做可以说是WTForms中的一个错误,因为返回"None"作为字符串确实非常奇怪. (2认同)

use*_*909 5

好的,我为此做了一个解决方法。我向该coerce字段添加了一个定义,并将空值从更改为''0如下所示:

myfield = SelectField('myfield', validators=[Optional()], coerce=int)
...
form.myfield.choices = ((0, ''), (1, 'apples'), (2, 'pears'))
Run Code Online (Sandbox Code Playgroud)

当然,这仅行得通,因为我的实际数据使用整数作为值。我不确定如果我的数据是字符串怎么办。