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

如何在Django中使用Bootstrap Modal实现删除功能?

解决Bootstrap Modal弹窗后无法删除的问题

肯定得加JavaScript——Bootstrap Modal只是个弹窗壳子,本身不会自动触发删除请求,得靠JS把点击确认的操作和删除逻辑绑起来。下面是具体解决步骤:

1. 调整Modal的HTML结构

给表格里的删除按钮加个自定义属性存条目ID,同时让Modal里的表单action能动态替换目标ID:

<!-- 表格中的删除按钮 -->
<button type="button" class="btn btn-danger delete-btn" data-id="{{ item.id }}" data-bs-toggle="modal" data-bs-target="#deleteModal">
  删除
</button>

<!-- Bootstrap 删除弹窗 -->
<div class="modal fade" id="deleteModal" tabindex="-1" aria-labelledby="deleteModalLabel" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="deleteModalLabel">确认删除</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        确定要删除这条记录吗?
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
        <!-- 表单action将通过JS动态赋值 -->
        <form id="deleteForm" method="POST" action="">
          {% csrf_token %}
          <button type="submit" class="btn btn-danger">确认删除</button>
        </form>
      </div>
    </div>
  </div>
</div>

2. 编写JavaScript绑定逻辑

监听删除按钮的点击事件,把当前条目的ID塞到表单的action里,确保提交时指向正确的Django删除接口:

// 获取所有删除按钮和删除表单
const deleteBtns = document.querySelectorAll('.delete-btn');
const deleteForm = document.getElementById('deleteForm');

deleteBtns.forEach(btn => {
  btn.addEventListener('click', function() {
    // 提取当前要删除的条目ID
    const itemId = this.getAttribute('data-id');
    // 替换表单action,这里要对应你的Django删除URL规则,比如 /item/delete/<id>/
    deleteForm.action = `/item/delete/${itemId}/`;
  });
});

3. 核对Django视图与URL配置

确保删除接口只接受POST请求,URL规则和视图逻辑匹配:

URL配置(urls.py)

path('item/delete/<int:pk>/', views.ItemDeleteView.as_view(), name='item-delete'),

类视图写法(views.py)

from django.views.generic.edit import DeleteView
from .models import Item
from django.urls import reverse_lazy

class ItemDeleteView(DeleteView):
    model = Item
    success_url = reverse_lazy('item-list')  # 删除成功后跳转的页面

函数视图写法(views.py)

from django.shortcuts import get_object_or_404, redirect
from .models import Item
from django.http import HttpResponseForbidden

def item_delete(request, pk):
    item = get_object_or_404(Item, pk=pk)
    if request.method == 'POST':
        item.delete()
        return redirect('item-list')
    # 拒绝GET请求,强制通过表单POST提交删除
    return HttpResponseForbidden()

排查要点

  • 打开浏览器控制台看有没有JS报错,比如找不到元素(要确保表单ID、按钮类名和代码里一致)
  • 检查页面源码里有没有正确渲染{% csrf_token %}(Django必须加这个防止跨站请求伪造)
  • 用浏览器开发者工具看网络请求,确认表单提交的URL是否正确,返回状态码是不是302(跳转)

内容的提问来源于stack exchange,提问作者Poramet Rodtanee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:20:35