当指定的对象不存在时,如何从 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】:

如果查询集中不存在对象,DetailViewget_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 的浅拷贝?

text 当试图从Jenkins运行shell时,如何解决“sudo:没有tty存在且没有指定askpass程序”

Django - 当页面不存在或用户未通过身份验证时返回更改答案