Flask+SQLite开发CRUD项目时点击删除按钮无法删除记录怎么解决
问题修复方案
你代码里共有4处核心错误导致删除功能失效,按以下步骤修改即可:
错误1:视图函数参数与数据获取逻辑错误
delete函数定义了必填参数book,但路由没有对应路径参数,同时你没有从表单中读取提交的书籍名称,需要修改为从request.form获取值,同时删除函数的入参。
错误2:SQL执行参数格式不符合SQLite要求
SQLite的execute方法第二个参数必须是元组,单个参数需要加逗号声明为元组,否则字符串会被拆分为单个字符匹配,无法命中记录。
错误3:表单提交路径与路由规则不匹配
你在操作页面的表单action为空,默认提交到当前访问路径,如果你是在/view页面打开的表单,该路由仅支持GET请求,POST请求会被直接拒绝,需要明确指定表单提交地址。
错误4:缺少更新操作的处理逻辑
当前仅实现了删除的判断分支,提交update按钮的请求无对应处理。
修复后完整代码
app.py
from flask import Flask, render_template, g, request, redirect, url_for import sqlite3 app = Flask(__name__) def connect_db(): connection = sqlite3.connect('./books.db') connection.row_factory = sqlite3.Row return connection def get_db(): if not hasattr(g, 'sqlite_db'): g.sqlite_db = connect_db() return g.sqlite_db # 关闭请求时自动释放数据库连接 @app.teardown_appcontext def close_db(error): if hasattr(g, 'sqlite_db'): g.sqlite_db.close() @app.route("/") def main(): return render_template('book.html') # 统一处理增改删的POST请求 @app.route('/', methods=['POST']) def handle_form(): db = get_db() book = request.form.get('book') # 书籍名称为空直接返回 if not book: return redirect(url_for('main')) # 删除逻辑 if request.form.get('submit') == 'delete': db.execute("delete from books where book = ?", (book,)) db.commit() # 新增/更新逻辑 elif request.form.get('submit') == 'update': author = request.form.get('author') category = request.form.get('category') db.execute("insert or replace into books (book, author, category) values (?, ?, ?)", (book, author, category)) db.commit() return redirect(url_for('view')) @app.route('/view', methods=["GET"]) def view(): db = get_db() cursor = db.execute('select * from books') rows = cursor.fetchall() return render_template('view.html', rows=rows) if __name__ == '__main__': app.run(debug=True)
操作页面(book.html,你之前贴的操作页代码调整后如下)
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>书店管理</title> </head> <body> <h1> 书籍记录增删操作 </h1> <!-- 明确指定提交到根路径的POST处理路由 --> <form action="/" method="POST" > <label for="book">书籍名称</label> <input type="text" id="book" name="book" required><br><br> <label for="author">作者</label> <input type="text" id="author" name="author"><br><br> <label for="category">书籍分类</label> <select name="category" id="category"> <option value></option> <option value="Fiction">小说</option> <option value="Non-Fiction">非虚构</option> <option value="Business">商业管理</option> <option value="Biography">传记</option> </select><br><br> <button type="submit" name="submit" value="update">更新/新增</button> <button type="submit" name="submit" value="delete">删除</button> </form> </body> </html>
内容的提问来源于stack exchange,提问作者Deepak Mishra
相关产品推荐
相关产品推荐

