1

オブジェクトが存在しない場合に別のテンプレートを使用するように、オブジェクトの管理者の既定の詳細ビューをオーバーライドしたい、つまり

<mydomain>/admin/<myapp>/<mymodel>/<someidthatdoesexist>/

デフォルトのオブジェクト詳細ビューをレンダリングする必要があり、

<mydomain>/admin/<myapp>/<mymodel>/<someidthatdoesNOTexist>/

デフォルトの 404 エラーではなく、カスタム テンプレートをレンダリングする必要があります。

私が読んだことからdjango.views.generic.detail.DetailView、 を使用する必要がありますが、どうすれば目的を達成できるかわかりません。

私は試した:

<b>in urls.py</b>

    url(r'^admin/<myapp>/<mymodel>/(?P<pk>\d+)/$', views.MyModelDetailView.as_view(), name='mymodel_detail'),
    url(r'^admin/', include(admin.site.urls)),

<b>in models.py</b>

class MyModelDetailView(DetailView):

    model = MyModel

    def get(self, request, *args, **kwargs):
        try:
            self.model.objects.get(pk=kwargs['pk'])           
            return super(MyModelDetailView, self).get(request, **kwargs)
        except Http404:
            # render custom template

しかし、私はTemplateDoesNotExistエラーが発生します:

<myapp>/mymodel_detail.html

オブジェクトが存在する場合にデフォルトのオブジェクト詳細ビューをレンダリングするには、どのテンプレートを設定すればよいですか?

編集

hereの例から、テンプレートを設定する必要はありません...

4

1 に答える 1

3

は、ソース コードのどこにも発生しDetailViewません。TemplateDoesNotExistしたがって、例外が発生している唯一の可能性のある場所は、リダイレクト ( return redirect(url)) です。

ところで、クラスベースのビュー コードを参照するのに非常に便利な場所は、http://ccbv.co.uk/projects/Django/1.5/django.views.generic.detail/Det​​ailView/ の上品なビューです

オブジェクトが存在しない場合のカスタム テンプレートのレンダリングに関しては、関数を簡単に変更してget機能させることができます。

class MyModelDetailView(DetailView):
    model = MyModel
    template_name = 'object_is_found.html' # <= make sure to have this

    def get(self, request, *args, **kwargs):
        try:
            self.object = self.get_object()
        except Http404:
            # return custom template
            return render(request, 'no_object.html', status=404)
        context = self.get_context_data(object=self.object)
        return self.render_to_response(context)
于 2013-03-13T15:01:45.113 に答える