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

当对象存在时,我应该设置什么模板来呈现默认对象详细信息视图?

编辑

这里给出的示例中,不需要设置模板...

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 回答