12

所以,现在当我的 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。

4

3 回答 3

21

如果对象在查询集中不存在,'DetailView方法get_object引发异常。您可以在视图的方法中捕获异常,Http404而不是覆盖该方法:get_objectget

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)
于 2013-01-11T21:57:30.703 回答
4

对于常见情况

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'))
于 2020-06-16T17:16:58.463 回答
2

您应该重新定义def get_object(self):DetailView

这个问题有类似的东西

于 2013-01-11T21:23:22.923 回答