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

Django技术问询:如何通过表格按钮实现对象删除功能

Django表格删除按钮失效问题修复方案

问题根源

你的数据库主键是ObjectId(字符串格式),但当前代码使用了整数类型的URL路径转换器,导致无法匹配;同时模板硬编码URL易出错,且GET请求删除存在安全风险。

分步修改

1. 调整urls.py

将路径中的<int:id>改为<str:id>,适配ObjectId的字符串格式:

path('delete/<str:id>/', views.delete, name='delete'),

2. 修正views.py

根据数据库_id字段调整查询条件(若你的ExcelData模型主键映射为_id),同时简化冗余的异常处理:

from django.shortcuts import get_object_or_404, redirect
from django.http import HttpResponse
from .models import ExcelData

def delete(request, id):  
    excel_data = get_object_or_404(ExcelData, _id=id)  # 匹配数据库的_id字段
    excel_data.delete()  
    return redirect('web_services_app:tables')

注:如果模型已将id定义为ObjectIdField并设为主键,可保留id=id的查询方式。

3. 优化tables.html模板

使用Django的{% url %}标签生成URL,避免硬编码路径错误;同时推荐更安全的POST请求删除方式:

方案一:快速生效的GET删除(仅用于测试)

替换原删除按钮的href属性:

<td>
    <a class="btn btn-danger" href="{% url 'web_services_app:delete' data.id %}">Delete</a>
</td>

方案二:安全的POST删除(生产环境推荐)

将链接改为表单提交,添加CSRF令牌防止跨站请求伪造:

<td>
    <form action="{% url 'web_services_app:delete' data.id %}" method="POST" style="display: inline;">
        {% csrf_token %}
        <button type="submit" class="btn btn-danger" onclick="return confirm('确定要删除这条数据吗?')">Delete</button>
    </form>
</td>

同时修改views.py,限定仅处理POST请求:

def delete(request, id):  
    if request.method == 'POST':
        excel_data = get_object_or_404(ExcelData, _id=id)
        excel_data.delete()  
        return redirect('web_services_app:tables')
    # 非POST请求返回错误
    return HttpResponse("不允许通过GET请求执行删除操作", status=405)

验证要点

  1. 确认ExcelData模型的主键字段与数据库_id对应(例如使用djongo时,模型定义为_id = models.ObjectIdField(primary_key=True))
  2. 测试时检查浏览器地址栏的URL是否正确传递了ObjectId字符串
  3. 查看Django控制台的错误日志,排查模型字段不匹配问题

内容的提问来源于stack exchange,提问作者Adam Rossonero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 22:00:12