Django删除数据库对象后重定向至指定视图的技术问询
问题描述
我希望在从数据库中删除对象后重定向到指定视图,以下是处理删除操作的视图代码:
def client_delete(request): if request.method == 'GET': return _not_exist_page(request) else: client = Client.objects.get(id=request.POST['id']) client.delete() print('deleted') return redirect('clients:index') print('deleted2')
执行删除操作后,终端显示内容如下:
deleted [03/Apr/2018 15:55:50] "POST /clients/delete/ HTTP/1.1" 302 0 [03/Apr/2018 15:55:50] "..."
请协助解决相关问题。
解决方案与分析
先给你说最直观的:你代码里的print('deleted2')永远不会执行,因为return redirect(...)一旦运行,函数就直接返回了,后面的代码根本走不到——这是Python函数的正常逻辑,不是bug哈。
再看你的删除逻辑,有几个可以优化的点,避免潜在问题:
- 处理对象不存在的情况:用
Client.objects.get()如果找不到对应ID的客户,会直接抛出DoesNotExist异常,导致服务器返回500错误。换成get_object_or_404会更友好,自动返回404页面:from django.shortcuts import get_object_or_404 def client_delete(request): if request.method == 'GET': return _not_exist_page(request) else: # 用get_object_or_404替代直接get,避免异常 client = get_object_or_404(Client, id=request.POST['id']) client.delete() print('deleted') return redirect('clients:index') - 安全获取POST参数:直接
request.POST['id']如果前端没传这个参数,会抛出KeyError。建议用get()方法获取,同时做个判断:def client_delete(request): if request.method == 'GET': return _not_exist_page(request) else: client_id = request.POST.get('id') if not client_id: # 这里可以返回你自定义的不存在页面,或者给前端提示 return _not_exist_page(request) client = get_object_or_404(Client, id=client_id) client.delete() print('deleted') return redirect('clients:index')
从终端日志的302状态码来看,重定向其实已经成功触发了!302就是告诉浏览器“去跳转到另一个页面”的状态码。如果你觉得页面没跳转,可以检查这几点:
- 确认
clients:index这个URL名称在你的urls.py里正确定义了,对应了正确的视图和路径 - 前端的删除表单是不是真的把请求POST到了
/clients/delete/这个地址 - 打开浏览器的开发者工具,看网络请求里是不是真的收到了302响应,并且跳转地址是对的
内容的提问来源于stack exchange,提问作者dor272
相关产品推荐
相关产品推荐

