如何正确删除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
相关产品推荐
相关产品推荐

