使用Flask将表单数据发送到数据库

时间:2017-10-11 22:35:50

标签: python flask flask-sqlalchemy flask-wtforms

我创建了一个带有文本字段和按钮的简单网页。我希望我的应用程序在单击按钮时使用文本字段的内容更新数据库中的记录。看起来很简单,但我无法弄清楚我错过了什么。到目前为止,这是我的代码:

app.py示例

@app.route('/update-audit/', methods=['POST'])
def update_audit(test_name, description):
    cur = connect_db()
    cur.execute('UPDATE audit SET description = ? WHERE test_name = ?', (description, test_name,))
    return render_template('clicked.html')

audit.html示例

<form action="{{ url_for('update_audit') }}" method="post">
    <td>{{ row[2] }}</td>
    <td>
        <input type="text" id="desc" value="{{ row[3] }}" size="140">
        <input type="hidden" name="update_audit" value="{{ row[2] }}, desc"/>
        <input type="submit" class="btn btn-success" value="Update"/>
    </td>
</form>

clicked.html

<!DOCTYPE html>
{% extends "layout.html" %}
{% block content %}
<body>
{{ form.description }}<br />
</body>
{% endblock %}

表格示例

id | tool name | test name | description
========================================
1  | "tool1"   | "test1"   | "update me!"

不确定我是否错过了一个基本概念(我玩过flask_wtf并且没有到达任何地方)或者我是否还有一两步远离这一点。

3 个答案:

答案 0 :(得分:1)

为文本输入设置名称属性,以便使用提交的表单发送。

<input name="description" type="text" id="desc" value="{{ row[3] }}" size="140">

更新您的视图功能,以获取request的POST字典属性中的说明。 test_name也需要更新为适当的值。

@app.route('/update-audit/', methods=['POST'])
def update_audit():
    description = request.form.get('description')
    test_name = request.form.get('update_audit')
    cur = connect_db()
    with cur:
        cur.execute(
            'UPDATE audit SET description = ? '
            'WHERE test_name = ?;', (description, test_name,))

    # commit changes to the database
    return render_template('clicked.html')

答案 1 :(得分:0)

你的render_template应该得到一个表单参数:

返回render_template('clicked.html',form = form)

在您提供的代码中,在python中处理Forms以及变量行的来源时,也不清楚。

答案 2 :(得分:0)

想出来:

app.py示例

@app.route('/update-audit/', methods=['POST'])
def update_audit():
    description = request.form.get('description')
    test_name = request.form.get('test_name')

    sql = 'UPDATE audit SET description=? WHERE test_name=?'
    conn = sqlite3.connect(DATABASE)
    cur = conn.cursor()
    cur.execute(sql, (description, test_name))
    conn.commit()
    conn.close()

    return render_template('clicked.html', data=(test_name, description))

audit.html示例

<form action="{{ url_for('update_audit') }}" method="POST">
    <td>
        <input type="hidden" name="test_name" value="{{ row[2] }}">{{ row[2] }}</input>
    </td>
    <td>
        <input type="text" name="description" id="desc" value="{{ row[3] }}" size="100" maxlength="140"/>
        <input type="submit" class="btn btn-success" value="Update"/>
    </td>
</form>
</tr>

答案是正确的SQL-Alchemy命令的组合,并确保我通过audit.html中的两个输入标记将数据发送到update_audit函数。