Как перенаправить из django DetailView, когда указанный объект не существует?

Итак, прямо сейчас, когда мой подкласс DetailView не находит объект с помощью PK (который взят из URL), я вижу 404.html шаблон страницы. Я бы предпочел просто перенаправить на другой URL-адрес. Вот мои шаблоны 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. Я бы предпочел, чтобы он пошел в список - на самом деле, FullListView указано, когда последний url (что происходит, когда url выглядит как / devices/nonnumericstuff/.

Кажется, что это должно быть легко, нет? Я не хочу, чтобы все 404 были там, поэтому я не могу использовать handler404.

2 ответов


на DetailView ' s get_object метод выдает Http404 исключение, если объект не существует в queryset. Вместо переопределения get_object метод вы можете поймать исключение в представлении get метод:

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)

вы должны переопределить def get_object(self): из DetailView

в этом есть что-то похожее вопрос