Django中替换404跳转至指定URL的实现方案咨询
解决Django DeleteView中替换Http404为跳转的问题
我明白你想要在用户尝试删除不属于自己的Prospect对象时,跳转到指定页面而不是抛出404错误。你之前用HttpResponseRedirect和reverse没成功,大概率是因为在get_object方法里的处理方式不对,或者reverse的参数有误(比如目标URL没有命名)。
下面给你两种可行的方案:
方案一:直接在get_object中返回跳转响应
这种方式最直接,因为get_object会被get和post方法同时调用,能覆盖所有请求场景:
首先导入必要的模块:
from django.shortcuts import redirect from django.http import HttpResponseRedirect
然后修改你的get_object方法:
def get_object(self, queryset=None): # 先获取基础对象 obj = super().get_object(queryset) # 检查对象是否属于当前用户 if obj.owner != self.request.user: # 两种跳转方式选其一即可 # 方式1:如果目标URL在urls.py里设置了name(比如name='notyours'),用reverse更灵活 return redirect('risking:notyours') # 假设命名空间是risking,URL名称是notyours # 方式2:如果URL没有命名,直接用URL字符串更稳妥 # return HttpResponseRedirect('/risking/notyours/') # 权限符合则返回对象 return obj
方案二:重写handle_no_permission方法(更符合Django规范)
如果你希望遵循Django的权限处理流程,可以结合PermissionDenied异常和重写权限处理方法:
首先导入异常类:
from django.core.exceptions import PermissionDenied
修改get_object抛出权限异常:
def get_object(self, queryset=None): obj = super().get_object(queryset) if obj.owner != self.request.user: raise PermissionDenied("This prospect doesn't belong to you") return obj
然后重写handle_no_permission来处理跳转:
def handle_no_permission(self): # 先处理未登录的情况(继承LoginRequiredMixin的逻辑) if not self.request.user.is_authenticated: return super().handle_no_permission() # 已登录但权限不足,跳转到指定页面 return redirect('/risking/notyours/')
为什么你之前的尝试失败?
- 如果用
reverse时出错,很可能是目标URL在urls.py里没有设置name属性,或者你没有指定正确的命名空间(如果有的话),这时候直接用URL字符串的HttpResponseRedirect会更稳妥。 - 另一个可能是你在
get_object里只是创建了HttpResponseRedirect对象但没有return它,导致逻辑继续执行并抛出了原来的404错误。
内容的提问来源于stack exchange,提问作者user1563247
相关产品推荐
相关产品推荐

