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

Python 使用flask从HTML表中删除单个SQLAlchemy行,python,flask,sqlalchemy,flask-sqlalchemy,flask-wtforms,Python,Flask,Sqlalchemy,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

我创建了一个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>
在app.py中,我创建了一个if语句:

if delete_form.validate_on_submit():

    print(f"merchant to delete ID - {delete_form.delete.id}")
我希望在输出中获得
single_merchant.id
,并在if语句中使用它从我的SQLAlchemy表中删除特定的商户,但是我在输出
merchant中删除id-delete
,即使从HTML文件中
id
属性的值为1,因为
{{single_merchant.id}
为1

有没有一种方法可以从HTML表中执行SQLAlchemy行删除?下面是一个HTML表的大致示例:


执行一个路由来处理删除:

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'))
然后,将以下内容添加到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>


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

您也可以使用原始方法,只需在具有删除按钮的表单中添加一个隐藏字段,其中的值可以是您的id。然后您只需显式定义
csrf\u令牌
,而不是使用
隐藏标记()
方法

在WtfForm类对象中定义一个隐藏字段,如:

类删除形式(烧瓶形式):
delete_id=HiddenField(“隐藏表行id”)
删除=提交字段(“删除”)
请注意,我翻转了
以使整个表格数据单元格就是表单

{% for single_merchant in merchants %}
<tr>
    <td>{{single_merchant.id}}</td>
    <td>
        <form method="post">
            {{ delete_form.csrf_token }}
            {{ delete_form.delete_id(value=single_merchant.id) }}
            {{ delete_form.delete(class="btn btn-danger") }}
        </form>
    </td>
</tr>

如果要将
条目\u to_delete
行与
db.session.delete()
相结合,只需将使用隐藏字段数据属性的查询放入对
delete()的调用中即可
method。我喜欢将这些部分分开,以防在删除之前需要对找到的条目执行任何附加操作,但这并不重要

这是我为家人开发的一个应用程序的截图,它允许我的孩子为我们的迪斯尼假期添加建议。我没有像你那样使用很酷的垃圾桶图标,但你明白了


Js通知实际上非常有用。谢谢
{% for single_merchant in merchants %}
<tr>
    <td>{{single_merchant.id}}</td>
    <td>
        <form method="post">
            {{ delete_form.csrf_token }}
            {{ delete_form.delete_id(value=single_merchant.id) }}
            {{ delete_form.delete(class="btn btn-danger") }}
        </form>
    </td>
</tr>