You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask图书管理应用删除功能失效,点击Delete按钮无效果求助

Flask图书管理应用删除操作失效问题解决

问题描述

开发类待办清单的图书管理应用时,点击页面上的Delete按钮后,对应的数据库记录并未被删除,仍保留在列表中。

相关代码

app.py 代码

from flask import Flask,render_template,request,redirect
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI']= "sqlite:///book.db"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']= False  # 修正键名大小写错误

with app.app_context():
    db = SQLAlchemy(app)

class Book(db.Model):
    Sno = db.Column(db.Integer,primary_key=True)
    Book_name = db.Column(db.String(300),nullable = False)
    Category = db.Column(db.String(300),nullable = False)
    Author = db.Column(db.String(300),nullable = False)
    Date_issued = db.Column(db.DateTime, default=datetime.utcnow)

    def __repr__(self) -> str:
        return f"{self.Book_name}-{self.Author}"

@app.route('/', methods=['GET','POST'])
def hello_world():
    if request.method=='POST':
         title=(request.form['title'])
         cat=(request.form['category'])
         author=(request.form['author'])
         book=Book(Book_name=title,Author=author,Category=cat)
         db.session.add(book)
         db.session.commit()
    allBook= Book.query.all()
    return render_template('index.html', allBook=allBook)

@app.route('/show')
def products():
     allBook= Book.query.all()
     print(allBook)
     return 'Here are some amazing products!'

@app.route('/update')
def update():
     allBook= Book.query.all()
     print(allBook)
     return 'Here are some amazing products!'

@app.route('/delete/<int:Sno>')  # 确保路由符号未被转义
def delete(Sno):
     book= Book.query.filter_by(Sno=Sno)
     db.session.delete(book)
     db.session.commit()
     return redirect("/")

if __name__=="__main__":
    app.run(debug=True,port=8000)

index.html 代码片段

<td>{{book.Book_name}}</td>
<td>{{book.Author}}</td>
<td>{{book.Category}}</td>
<td>{{book.Date_issued}}</td>
<td><a href="/update/{{book.Sno}}" type="button" class="btn btn-primary btn-sm mx-1">Update</button></td>
<td><a href="/delete/{{book.Sno}}" type="button" class="btn btn-primary btn-sm mx-1">Delete</button></td>

问题原因

delete视图函数中,Book.query.filter_by(Sno=Sno)返回的是查询对象(Query),而非具体的Book模型实例。db.session.delete()方法需要传入数据库模型的实例才能执行删除操作,传入查询对象无法触发正确的删除逻辑。

解决方法

将获取图书实例的代码替换为能返回具体实例的方法,推荐两种写法:

方法1:使用.first()获取匹配实例

@app.route('/delete/<int:Sno>')
def delete(Sno):
     book= Book.query.filter_by(Sno=Sno).first()
     if book:  # 增加判断避免实例不存在时报错
         db.session.delete(book)
         db.session.commit()
     return redirect("/")

方法2:使用get_or_404()(更健壮)

get_or_404()会根据主键查找实例,找不到则直接返回404页面,无需额外判断:

@app.route('/delete/<int:Sno>')
def delete(Sno):
     book= Book.query.get_or_404(Sno)
     db.session.delete(book)
     db.session.commit()
     return redirect("/")

额外注意点

  • 原代码中SQLALCHEMY_track_MODIFICATIONS键名大小写错误,应改为SQLALCHEMY_TRACK_MODIFICATIONS,否则会触发SQLAlchemy警告;
  • 确保路由定义中的<int:Sno>未被HTML转义(如&lt;int:Sno&gt;),否则路由无法正确匹配请求。

内容的提问来源于stack exchange,提问作者Arijeet Sahu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 16:27:28