在基于类的View中指定模板名称

时间:2013-05-31 11:31:41

标签: django django-views

我是Django的新手并尝试从django-jquery-file-upload

开始工作

它向我介绍了基于类的视图。

我正在尝试复制其中一个基于类的视图,以包含一个共享链接,该链接将引用该库中的各个链接。

我试图改编的课程是:

class PictureDeleteView(DeleteView):
model = Picture

def delete(self, request, *args, **kwargs):
    """
    This does not actually delete the file, only the database record. But
    that is easy to implement.
    """
    self.object = self.get_object()
    self.object.delete()
    if request.is_ajax():
        response = JSONResponse(True, {}, response_mimetype(self.request))
        response['Content-Disposition'] = 'inline; filename=files.json'
        return response
    else:
        return HttpResponseRedirect('/upload/new')

class JSONResponse(HttpResponse):
    """JSON response class."""
    def __init__(self,obj='',json_opts={},mimetype="application/json",*args,**kwargs):
        content = simplejson.dumps(obj,**json_opts)
        super(JSONResponse,self).__init__(content,mimetype,*args,**kwargs)

默认为模板名称picture_confirm_delete.html

如何重写具有相同功能的类,除非它指向不同的模板?或更好的&为了与'DRY'保持一致,我如何在另一个模板上重用这个类?

我查看了文档here,但似乎无法根据我的需求进行调整。

提前致谢。

2 个答案:

答案 0 :(得分:5)

简而言之,这就是目前正在发生的事情:Django中的DeleteView将基于类名呈现默认模板,如文档中所述:

  

向GET请求显示的DeleteView页面使用template_name_suffix '_confirm_delete'

要更改此功能,请通过提供template_name argument

来否决此行为
  

template_name

     

由字符串定义使用的模板的全名。

这适用于从TemplateResponseMixin继承的任何内置的基于类的视图。

将其应用于网址格式中的类定义(根据您的喜好):

  • 在课堂上:

    class MyOwnPictureDeleteView(PictureDeleteView):
        template_name = "myown_picture_delete_template.html"
    

    是的,这是您基于全新课程的全新视图。

  • 在URLconf中:

    url(r'^picture_delete/(?P<pk>\d+)/', 'myapp.views.PictureDeleteView', \
    {'template_name': 'myown_picture_delete_template.html'}),
    

无论哪种方式,您都不必重写原始PictureDeleteView类的单行,因此它就像DRY一样。

答案 1 :(得分:1)

由于DeleteView也继承自SingleObjectTemplateResponseMixin,因此需要模板,因此需要模板名称。

但是,由于您并未使用Django DeleteView提供的功能,而是使用HTTP方法DELETE创建自己的功能,因此您只需更改视图的父类DeleteView即可。到View

否则,检查哪些功能来自DeleteView所需的this,{{3}}是浏览基于类的视图的良好起点(官方Django文档还没有。)< / p>