Django delete函数无法删除数据库数据 点击删除按钮无反应求助
问题原因及对应解决方案
1. 模板删除按钮逻辑冲突
你的Remove按钮添加了data-toggle="modal" data-target="#delete"属性,点击后只会触发Bootstrap模态框弹出,不会直接跳转删除链接,如果你没有给模态框的确认按钮绑定对应的删除逻辑,点击后自然不会执行删除操作。
修复方案:
如果不需要模态框二次确认,直接删除这两个属性即可,修改后按钮代码如下:
<a class="dropdown-item text-danger" href="/delete/{{ drug.drug_id }}"><span class="fas fa-trash-alt mr-2"></span>Remove</a>
如果需要保留二次确认逻辑,给模态框的确认按钮添加跳转对应删除链接的JS逻辑即可。
2. 路由参数类型不匹配
你的Drug模型中drug_id字段是CharField字符串类型,但删除路由里写的是<int:drug_id>,只能匹配整数类型的参数,传入字符串格式的drug_id会匹配不上路由,请求根本到不了删除视图。
修复方案:
修改ddms/urls.py中的删除路由,把参数类型改为str,同时补充尾斜杠避免Django重定向问题:
path('delete/<str:drug_id>/', destroy),
3. 删除视图冗余代码(可选优化)
你在destroy视图中调用d.delete()后又执行了d.save(),对象已经被删除,save操作完全无效,属于冗余代码,可以删除。同时建议添加404捕获逻辑,避免传入不存在的drug_id时报错:
首先导入get_object_or_404工具:
from django.shortcuts import render, redirect, get_object_or_404
修改后视图代码:
def destroy(request, drug_id): d = get_object_or_404(Drug, drug_id=drug_id) d.delete() return redirect("/")
可选规范优化
你的DrugListView中context_object_name设置为drug,循环时又用了for drug in drug,变量名重复容易引发逻辑异常,建议修改context_object_name为drug_list,对应模板循环改为{% for drug in drug_list %}。
内容的提问来源于stack exchange,提问作者William Le

