我正在使用Flask和Jinja2,我需要创建一个包含多行的可编辑表。
这就是桌子的样子:
下面是HTML:
<form action="/support/team-members-update" method="post">
<table>
<tbody><tr>
<th>Name</th>
<th>Id</th>
<th>Inbox Share</th>
</tr>
<tr>
<td>Ben</td><td>55555</td><td><input type="text" name="share_55555" value="0"></td></tr> <tr>
<td>Steve</td><td>66666</td><td><input type="text" name="share_66666" value="1"></td></tr> <tr>
<td>Harry</td><td>77777</td><td><input type="text" name="share_77777" value="1"></td></tr> <tr>
<td>Sally</td><td>88888</td><td><input type="text" name="share_88888" value="1"></td></tr></tbody></table>
<button type="submit">Send</button>
</form>
我目前的实现是在Lua中,我在那里硬编码一堆字符串,并手动将post数据连接到本地Lua类型(有趣!)。如果必须这样做,我也可以用Python手工处理表单数据,但我想可能有更好的解决方案。
我对WTForms进行了一些探索,但是没有太多的运气让它正常工作。
我确实找到了FieldList,但这似乎处理的是同一字段的列表,而不是同一字段的多行。
我也找到了TableWidget,但是文档很稀疏,我不知道如何实现它来知道这是否能实现我所期望的功能。
FieldList将起作用,您需要创建一个FormField列表。像这样指定FormField:
然后可以在视图函数中从数据库创建表单,如下所示:
然后在模板中,您可以在创建表行时对
teammembers
中的每个项进行迭代:我从来没能让WTForms按照我想要的方式工作。我认为这对我的需求来说有点太重了,所以我最终使用了自己的Jinja2模板来构建表单,然后使用
formencode
库将post变量解析为dict。这对我来说足够好了。(感谢this question将我指向formencode
库)。我将粗略地介绍一下我正在使用的各种文件,然后在底部解释重要的部分:
应用程序py:
我有三个模板文件,但你当然不需要这么多。team-members.html包含与此问题相关的代码。
_formhelpers.html:
layout.html格式:
组员.html:
这将呈现以下HTML:
值得一提的是app.py的
if request.method == 'POST':
部分发生了什么。request.form
变量将是ImmutableMultiDict
类型,打印出来时类似于这样:这有点有用,但是我们仍然需要手工解析它来处理它。注意键的格式,格式为
id_fieldname
(例如55555_share
)。这要感谢我们在formhelpers.html模板文件中放入的render_input
宏。当我们处理post表单输入时,我们使用variabledecode.variable_decode(request.form, dict_char='_')
,它解析表单数据并根据我们用于表单输入的name
值的命名约定将其转换为字典。下面是它的样子:这使得我们很容易映射回原始数据并更新它。
我从来没能让WTForms按照我想要的方式工作。我认为这对我的需求来说有点太重了,所以我最终使用了自己的Jinja2模板来构建表单,然后使用
formencode
库将post变量解析为dict。这对我来说足够好了。(感谢this question将我指向formencode
库)。我将粗略地介绍一下我正在使用的各种文件,然后在底部解释重要的部分:
应用程序py:
我有三个模板文件,但你当然不需要这么多。team-members.html包含与此问题相关的代码。
_formhelpers.html:
layout.html格式:
组员.html:
这将呈现以下HTML:
值得一提的是app.py的
if request.method == 'POST':
部分发生了什么。request.form
变量将是ImmutableMultiDict
类型,打印出来时类似于这样:这有点有用,但是我们仍然需要手工解析它来处理它。注意键的格式,格式为
id_fieldname
(例如55555_share
)。这要感谢我们在formhelpers.html模板文件中放入的render_input
宏。当我们处理post表单输入时,我们使用variabledecode.variable_decode(request.form, dict_char='_')
,它解析表单数据并根据我们用于表单输入的name
值的命名约定将其转换为字典。下面是它的样子:这使得我们很容易映射回原始数据并对其进行更新。
相关问题 更多 >
编程相关推荐