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

函数视图转类视图:DetailView遇DoesNotExist时如何重定向?

处理Profile不存在时的重定向问题

我来帮你搞定这个问题~在Django的DetailView里,默认遇到DoesNotExist异常会返回404页面,但要改成重定向到指定URL,有两种靠谱的实现方式:

方式一:重写get方法捕获异常(更规范)

这种方式更贴合类视图的设计逻辑,get方法负责处理整个GET请求流程,我们在这里捕获对象不存在的异常,直接返回重定向响应:

from django.shortcuts import redirect
from django.views import generic
from .models import Profile

class ProfileView(generic.DetailView):
    model = Profile
    template_name = 'area51/profile.html'

    def get(self, request, *args, **kwargs):
        try:
            # 先尝试获取对象,成功就走父类的正常渲染流程
            self.object = self.get_object()
            return super().get(request, *args, **kwargs)
        except Profile.DoesNotExist:
            # 替换成你实际要跳转的URL名称(urls.py里定义的name)或者具体路径
            return redirect('profile-not-found')

方式二:在get_object中直接捕获异常

如果你更习惯在获取对象的方法里处理,也可以直接在get_object中捕获异常并返回重定向,这是特殊场景下的灵活用法:

from django.shortcuts import redirect
from django.views import generic
from .models import Profile

class ProfileView(generic.DetailView):
    model = Profile
    template_name = 'area51/profile.html'

    def get_object(self, queryset=None):
        try:
            return Profile.objects.get(**self.kwargs)
        except Profile.DoesNotExist:
            # 替换成你的目标URL
            return redirect('/profile-not-found/')

小提示

  • 推荐用URL名称(比如redirect('profile-not-found'))而非硬编码路径,后续修改URL结构时更省心。
  • 如果需要给重定向的URL传参数,直接在redirect里追加即可,比如redirect('profile-not-found', user_id=self.request.user.id)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:15:47