python - 使用 Flask、Jinja2 模板渲染一个可编辑的表格,然后处理返回的表格数据

标签 python flask jinja2 wtforms

我正在使用 Flask 和 Jinja2,我需要制作一个包含多行的可编辑表格。

这是表格的样子:

img

这里是 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 中,我在其中硬编码一堆字符串并手动将发布数据连接到本地 Lua 类型(有趣!)。如果必须,我也可以在 Python 中手动处理表单数据,但我想可能有更好的解决方案。


我已经对 WTForms 进行了一些探索,但没能让它正常工作。

我确实找到了 FieldList ,但这似乎处理的是同一字段的列表,而不是具有完全相同字段的多行。

我还找到了TableWidget ,但文档很少,我无法弄清楚如何实现它以了解它是否可以实现我想要做的事情。

最佳答案

FieldList 可以工作,您需要列出 FormField .像这样指定您的 FormField:

class MemberForm(Form):
    name = StringField('name')
    member_id = StringField('member_id')
    inbox_share = IntegerField('inbox_share')
    # etc.

class TeamForm(Form):
    title = StringField('title')
    teammembers = FieldList(FormField(MemberForm))

然后您可以在 View 函数中从您的数据库创建表单,如下所示:

@app.route('/support/team-members-update', methods=['GET','POST'])
def update_team_members():
    teamform = TeamForm()
    teamform.title.data = "My Team" # change the field's data
    for member in DB.get('teammembers') # some database function to get a list of team members
        member_form = MemberForm()
        member_form.name = member.name # These fields don't use 'data'
        member_form.member_id = member.id
        member_form.inbox_share = member.share

        teamform.teammembers.append_entry(member_form)

    return render_template('edit-team.html', teamform = teamform)

然后在模板中,您可以在创建表格行时遍历 teammembers 中的每个项目:

<html>
    <head>
        <title>Edit Team Members</title>
    </head>
    <body>
        <h1>Edit Team</h1>
        <div>
            <form action="" method="post" name="teamform">
                {{ teamform.hidden_tag() }}
                Team Title: {{ teamform.title }}<br>
                <div>
                    <table>
                        <tr>
                            <th> Name </th>
                            <th> ID </th>
                            <th> Inbox Share </th>
                        </tr>
                        {% for member in teamform.teammembers %}
                        <tr>
                            <td>{{ member.name }}</td>
                            <td>{{ member.member_id }}</td>
                            <td>{{ member.inbox_share }}</td>
                        </tr>
                        {% endfor %}
                    </table>
                </div>
                <p><input type="submit" name="edit" value="Send"></p>
            </form>
        </div>
    </body>
</html>

关于python - 使用 Flask、Jinja2 模板渲染一个可编辑的表格,然后处理返回的表格数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29504067/

相关文章:

python - django错误: django. urls.exceptions.NoReverseMatch

python - 如何强制使用指定时区的 python 打印 numpy datetime64?

python - 使用 jinja 标签在 html 标签内使用 if 条件

python - 如何将嵌套列表转换为字典?

python - pytorch torch.jit.trace 返回函数而不是 torch.jit.ScriptModule

python - 将变量传递给 Python Flask 表单

python - send_static_file 未从蓝图中根目录的静态文件夹中获取

python - 将 kik 机器人部署到 heroku 不起作用

python - jinja2模板引擎中的这个 "-"是做什么的?

python - Jinja2 中关于 for 语句的 If 语句