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

如何正确删除Django模型实例:日历事件删除异常问题排查

问题原因

你遇到的问题是三个配置错误共同导致的:

  • 删除路由没有配置event_id参数捕获,模板中传递的事件ID无法传入视图函数,event_delete方法中event_id始终为默认值None
  • 模板中获取事件ID的写法错误,form.id是表单控件的ID,不是绑定的事件实例主键
  • 第一次请求时Event.objects.get(pk=None)匹配到了其他数据并将其删除,第二次请求时无匹配数据抛出DoesNotExist错误,而你实际要删除的目标事件因为ID从未正确传入后端,所以始终未被删除

修复步骤

1. 修改urls.py的删除路由

添加event_id参数捕获规则:

from django.conf.urls import url
from . import views

app_name = "cal"
urlpatterns = [
    url(r"^index/$", views.index, name="index"),
    url(r"^calendar/$", views.CalendarView.as_view(), name="calendar"),
    url(r"^event/new/$", views.event, name="event_new"),
    url(r"^event/edit/(?P<event_id>\d+)/$", views.event, name="event_edit"),
    # 修改删除路由,添加event_id捕获
    url(r"^event/delete/(?P<event_id>\d+)/$", views.event_delete, name="event_delete"),
]

2. 优化views.py的删除逻辑

添加请求方法校验、异常捕获,避免直接抛出500错误:

from django.shortcuts import get_object_or_404, redirect
from django.views.decorators.http import require_POST
from django.contrib import messages

# 限制仅POST请求可调用删除接口
@require_POST
def event_delete(request, event_id):
    # 找不到对应事件直接返回404,不会抛出DoesNotExist错误
    event = get_object_or_404(Event, pk=event_id)
    # 可选:添加权限校验,只允许事件创建者删除
    # if event.user != request.user:
    #     return HttpResponseForbidden("你没有权限删除该事件")
    event.delete()
    # 可选:添加操作提示
    messages.success(request, "事件删除成功")
    return redirect("cal:calendar")

3. 修改event.html的删除按钮

不要用GET请求(a标签)做删除操作,改成POST表单提交,同时修正事件ID的获取写法:
把原来的删除按钮a标签替换为以下代码:

<form action="{% url 'cal:event_delete' form.instance.id %}" method="post" style="display: inline;">
    {% csrf_token %}
    <button type="submit" class="btn cancel-button buttons login_btn" style="font-family:Optima;" onclick="return confirm('确定要删除该事件吗?')">删除事件</button>
</form>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:06:00