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

Django中使用Sweetify确认框删除对象无响应的问题排查

问题原因

你的代码逻辑完全误解了Sweetify的工作机制:

  • Sweetify弹窗是前端交互组件,后端调用sweetify.sweetalert只是向前端返回包含弹窗配置的响应,此时用户还未进行点击操作,sweetify_response.get('did_confirm')必然为空,直接进入else分支跳转列表页,根本没执行删除逻辑。
  • 最初直接删除有效,是因为前端直接发送了DELETE请求,后端执行了父类的delete方法;现在加弹窗后,后端返回弹窗但前端没有绑定「点击确认后重新发送删除请求」的逻辑,导致无后续动作。
解决方法

推荐采用「前端控制弹窗+后端处理删除请求」的方案,逻辑更清晰:

1. 修改前端模板,绑定弹窗与删除请求

假设你的删除按钮是通过模板渲染的,修改为如下逻辑:

<!-- 替换原有删除按钮 -->
<button class="delete-btn" data-delete-url="{% url 'dashboard_user:order-delete' order.id %}">删除</button>

<script>
// 给所有删除按钮绑定点击事件
document.querySelectorAll('.delete-btn').forEach(btn => {
  btn.addEventListener('click', function(e) {
    e.preventDefault();
    const deleteUrl = this.getAttribute('data-delete-url');
    
    // 触发Sweetify确认弹窗
    Swal.fire({
      title: 'آیا مطمٔنید؟',
      text: "آیا واقعا میخواهید سفارش مورد نظر حذف شود؟",
      icon: 'warning',
      showCancelButton: true,
      confirmButtonText: 'حذف',
      cancelButtonText: 'انصراف',
      dangerMode: true,
      timer: 15000,
      focusConfirm: true
    }).then((result) => {
      // 用户确认后发送DELETE请求
      if (result.isConfirmed) {
        fetch(deleteUrl, {
          method: 'DELETE',
          headers: {
            'X-CSRFToken': '{{ csrf_token }}', // Django必须的CSRF令牌
            'Content-Type': 'application/json'
          }
        }).then(response => {
          if (response.ok) {
            // 删除成功后跳转回订单列表
            window.location.href = "{% url 'dashboard_user:order-list' %}";
          } else {
            Swal.fire('خطا', 'حذف سفارش با شکست مواجه شد', 'error');
          }
        });
      }
    });
  });
});
</script>

2. 简化后端DeleteView视图

去掉错误的弹窗判断逻辑,回归正常的删除处理:

class DeleteOrder(DeleteView):
    model = OrderDetail
    success_url = reverse_lazy('dashboard_user:order-list')

    def delete(self, request, *args, **kwargs):
        try:
            response = super().delete(request, *args, **kwargs)
            messages.success(request, 'سفارش مورد نظر با موفقیت حذف شد')
            return response
        except Exception as e:
            messages.error(request, str(e))
            return redirect(self.success_url)

    # 注意:如果OrderDetail的get_absolute_url不是指向订单列表页,建议删除此方法,避免覆盖success_url
    # def get_success_url(self):
    #     return self.object.get_absolute_url()
额外注意事项
  • 确保前端已正确引入Sweetify的JS和CSS资源,否则弹窗无法正常渲染。
  • 若保留get_success_url方法,需确认其返回地址与业务需求一致,避免删除后跳转错误页面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:17:50