【问题标题】:Get None from a Fields data in instead of an empty string从字段数据中获取 None 而不是空字符串
【发布时间】:2015-03-20 18:46:38
【问题描述】:

我在WTForms 表单中有这个字段

name = StringField('Name', validators = [Optional(), Length(max = 100)])

当字段提交为空时,form.name.data 将如预期的那样包含一个空字符串。

有没有办法让它返回None 而不是空字符串?只是因为像update这样在数据库中处理null非常方便:

update t
set 
    name = coalesce(%(name)s, name),
    other = coalesce(%(other)s, other)

使用上面的代码,我不需要检查该字段是否为空,并在 SQL 代码中的 Python 代码中采取相应的操作。 nullcoalesce 可以轻松解决这个问题。

【问题讨论】:

  • 我会说这是值得怀疑的,因为从浏览器接收到的 actual 数据实际上将包含该字段的空字符串。自己检查字段值并用None 替换空字符串有什么问题?例如。 whatever_database.insert_record(form.name.data or None, form.other.data or None)
  • @lanzz 怎么了... 没什么。只是我认为将逻辑留在它所属的地方(IMO)更干净;表单处理器
  • @lanzz 如果 WTForms 有任何工具可以自动重写表单数据...。确实有。检查我的答案。
  • 有趣的是,如果表单数据来自 JSON POST(而不是 HTML 表单提交),则缺少键将导致来自 StringField 的空字符串。这是违反直觉的 IMO,因为这意味着无法区分“用户没有为此字段输入值”和“用户提交了一个空字符串”,这在应用程序中可能具有非常不同的语义(它在我的)。

标签: python wtforms flask-wtforms


【解决方案1】:

Field 构造函数有 filters 参数

name = StringField(
    'Name', 
    validators = [Optional(), Length(max = 100)], 
    filters = [lambda x: x or None]
)

http://wtforms.readthedocs.org/en/latest/fields.html#the-field-base-class

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 2019-01-24
    • 1970-01-01
    相关资源
    最近更新 更多