函数视图转类视图: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
相关产品推荐
相关产品推荐

