【问题标题】:Flask-WTF dynamic select field gives "None" as a stringFlask-WTF 动态选择字段将“None”作为字符串
【发布时间】:2016-02-17 15:03:40
【问题描述】:

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

myfield = SelectField('myfield', validators=[Optional()])

我正在尝试使用如下所示的 GET 请求来完成这项工作:

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

然后,当我尝试在一个空表单上进行验证时。 (我去 myapp.com 没有 GET 参数)

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

【问题讨论】:

标签: wtforms flask-wtforms


【解决方案1】:

我发现在空字符串中添加default参数可以解决问题。

这似乎是支持空字符串作为带有SelectField 的选项/选项的必要条件。

例子:

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

【讨论】:

  • 不得不这样做可以说是 WTForms 中的一个错误,因为将"None" 作为字符串返回确实非常奇怪。
  • 不是很明显的解决办法,我也觉得是bug
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多