【问题标题】:How to properly add column headers into WTForms dynamic selectfield list如何将列标题正确添加到 WTForms 动态选择字段列表中
【发布时间】:2019-05-17 17:48:33
【问题描述】:

我有一个 Pandas 数据框,并试图将列标题返回到 Flask 应用程序上的 WTForm 动态列表中。 但是,当我尝试提交 HTML 表单时,出现验证错误。这是我的表单类错误。

   data = pd.read_excel("sampledata.xlsx")
   col_headers = list(data.columns)

   col_list = list(col_headers)
   dic_list = {i : col_list[i] for i in range(0, len(col_list))}


   class StatementForm(FlaskForm):
   date = SelectField('Date', choices = [(key, dic_list[key]) for key in dic_list])

我已经通过在选择列表中手动输入一个元组来测试 HTML 表单并且它有效。显然问题出在“日期”参数和选项中。

非常感谢您在修改代码方面的帮助。

【问题讨论】:

  • 请提供完整的回溯。
  • 在您的选择理解中尝试str(key)。以我的经验,SelectField 不喜欢整数键。
  • 另外,您可以通过以下方式摆脱一些步骤:choices = [(str(x), y) for (x, y) in list(enumerate(data.columns))] 并在一行中完成所有操作。让我知道这是否有效
  • @snakecharmerb 控制台上没有什么可显示的,验证规则会阻止代码加载。这是截图pasteboard.co/IfaeH7r.png
  • @WoodyPride 有点用,因为我的表单现在显示列标题值并提交。但是我注意到,每当调用数据时,它就是输出的键或索引 ID。 form = StatementForm()date = form.date.data日期返回一个索引号

标签: python python-3.x pandas flask-wtforms wtforms


【解决方案1】:

尝试使用以下方法来创建您的选择:

choices = [(str(x), y) for (x, y) in list(enumerate(data.columns))]

不同的是,上面代码中的那个值是一个字符串。根据 WFT-Forms 文档:

选择字段保留一个选择属性,该属性是(值,标签)对的序列。 value 部分理论上可以是任何类型,但由于表单数据是由浏览器作为字符串发送的,因此您需要提供一个函数,该函数可以将字符串表示形式强制转换为可比较的对象。

在您的版本中,您尝试将整数作为值传递,这就是它失败的原因。

【讨论】:

    猜你喜欢
    • 2017-10-07
    • 1970-01-01
    • 2020-05-02
    • 2014-08-09
    • 2013-11-23
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多