当指定的对象不存在时,如何从 Django DetailView 重定向?
Posted
技术标签:
【中文标题】当指定的对象不存在时,如何从 Django DetailView 重定向?【英文标题】:How do I redirect from a Django DetailView when the specified object doesn't exist? 【发布时间】:2012-12-26 12:59:01 【问题描述】:所以,现在当我的 DetailView 子类没有使用 PK(取自 URL)找到对象时,我看到了 404.html 模板页面。我宁愿做的只是重定向到另一个 URL。这是我的网址格式:
url(r'^(?P<pk>[0-9]+)/$', DeviceDetailView.as_view(
template_name='devices/detail.html',
queryset=Device.objects.all(),
context_object_name="device",
)),
url(r'^$', FullListView.as_view(template_name='devices/devices.html',)),
所以,如果我的 url 看起来像 /devices/8/,它使用 8 作为主键。当数据库中存在 8 时效果很好。但是,当 8 不存在时,它会转到 404 页面。我宁愿它做的是去一个列表 - 事实上,在最后一个 url 时列出的 FullListView (当 url 看起来像 /devices/nonnumericstuff/ 时会发生这种情况。
看起来应该很容易,不是吗?我不希望所有 404 都去那里,所以我不能使用 handler404。
【问题讨论】:
我应该提到,上面的 urlpatterns sn-p 来自 urls.py,它包含在主 urls.py 中,这是添加 /devices/ 部分的方式。 Redirect from Generic View DetailView in Django 的可能重复项 【参考方案1】:你应该重新定义DetailView的def get_object(self):
这个question也有类似的东西
【讨论】:
我发现 - 但是,该方法想要返回一个对象。除了抛出 404 之外没有其他对象时我会返回什么?【参考方案2】:如果查询集中不存在对象,DetailView
的 get_object
method 会引发 Http404
异常。您可以在视图的 get
method 中捕获异常,而不是覆盖 get_object
方法:
from django.http import Http404
from django.views.generic import DetailView
from django.shortcuts import redirect
class MyDetailView(DetailView):
def get(self, request, *args, **kwargs):
try:
self.object = self.get_object()
except Http404:
# redirect here
return redirect(url)
context = self.get_context_data(object=self.object)
return self.render_to_response(context)
【讨论】:
【参考方案3】:常见情况
from django.http import Http404
from django.shortcuts import redirect
from django.urls import reverse
from django.views.generic import DetailView
class MyDetailView(DetailView):
def get(self, request, *args, **kwargs):
try:
return super().get(request, *args, **kwargs)
except Http404:
return redirect(reverse('my_list_view_name'))
【讨论】:
以上是关于当指定的对象不存在时,如何从 Django DetailView 重定向?的主要内容,如果未能解决你的问题,请参考以下文章
如果对象存在,我如何编辑它或创建 Django 中不存在的对象?
Django:如何检索“object_detail”通用视图选择的对象?
Django REST Framework:当 POST 上存在额外字段时引发错误
当对象的上下文不同时,如何制作 NSManagedObject 的浅拷贝?