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转义(如<int:Sno>),否则路由无法正确匹配请求。
内容的提问来源于stack exchange,提问作者Arijeet Sahu
相关产品推荐
相关产品推荐

