使用 Flask 从 HTML 表中删除单个 SQLAlchemy 行

d1s*_*ack 2 python sqlalchemy flask flask-sqlalchemy flask-wtforms

我创建了一个 HTML 表,其中列出了 SQLAlchemy 表中的许多行。该表是使用 jinja2 模板通过循环创建的:

{% for single_merchant in merchants %}
        <tr>
            <td>{{single_merchant.id}}</td>
            <td><button type="button" class="btn btn-sm btn-outline-danger">Delete</button>
        </tr>
Run Code Online (Sandbox Code Playgroud)

每行都有一个“删除”按钮。我正在尝试弄清楚如何分配删除按钮来删除该特定的 SQLalchemy 行。我尝试将按钮创建为名为的单独烧瓶形式delete_form,并添加一个id="{{single_merchant.id}}属性,button如下所示:

{% for single_merchant in merchants %}
            <tr>
                <td>{{single_merchant.id}}</td>
                <form method="post">
                {{ delete_form.hidden_tag() }}
                <td>{{ delete_form.delete(id=single_merchant.id) }}</td>
                </form>
            </tr>
Run Code Online (Sandbox Code Playgroud)

然后在 app.py 中我创建了一个 if 语句:

if delete_form.validate_on_submit():

    print(f"merchant to delete ID - {delete_form.delete.id}")
Run Code Online (Sandbox Code Playgroud)

我希望获得single_merchant.id输出并在 if 语句中使用它从我的 SQLAlchemy 表中删除特定商家,但相反,我得到了输出,merchant to delete ID - delete即使从 HTML 文件中该id属性的值为 1,因为{{single_merchant.id}}1

有没有办法从 HTML 表中执行 SQLAlchemy 行删除?下面是 HTML 表格的大致示例:

在此输入图像描述

Cod*_*tle 5

实现一个处理删除的路由:

def merch_delete(mid):
    merch = Merchant.query.filter_by(id=mid).first()
    if merch:
        msg_text = 'Merchant %s successfully removed' % str(merch)
        cs.delete(merch)
        cs.commit()
        flash(msg_text)
    return redirect(url_for('merchants_view'))
Run Code Online (Sandbox Code Playgroud)

然后,将以下内容添加到 jinja 表中的列中:

<a href="{{ url_for('merch_delete', mid=single_merchant.id) }}"
  onclick="return confirm('Do you want to permanently delete merchant {{ merchant }}?');" title="Delete Merchant">
  <i class="material-icons" style="font-size:16px">delete</i></a>
Run Code Online (Sandbox Code Playgroud)

图标和Js验证步骤是可选的。