12

したがって、現在、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を使用できません。

4

3 に答える 3

21

DetailViewオブジェクトがクエリセットに存在しない場合、 のメソッドは例外をget_object発生させます。Http404メソッドをオーバーライドする代わりに、ビューのメソッド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)
于 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 に答える