Django - render()、render_to_response() 和 direct_to_template() 有何区别?
def comment_edit(request, object_id, template_name='comments/edit.html'):
comment = get_object_or_404(Comment, pk=object_id, user=request.user)
# ...
return render(request, template_name, {
'form': form,
'comment': comment,
})
return render_to_response(template_name, my_data_dictionary,
context_instance=RequestContext(request))
return direct_to_template(request, template_name, my_data_dictionary)
在Django中,render()
、render_to_response()
和direct_to_template()
这三个函数有什么区别呢?用一个刚接触Python和Django的小白能懂的语言来说,就是它们都是用来把数据和模板结合起来,生成网页的,但用法和适用场景有点不同。
首先,render()
是最常用的一个,它会把你传入的数据和指定的模板结合起来,然后返回一个完整的网页。这个函数会自动处理一些常见的事情,比如上下文处理器,这样你就不需要自己去处理那些额外的内容了。
接下来是render_to_response()
,这个函数也能做类似的事情,但它不会自动处理上下文,所以你需要手动传入一些额外的内容。这意味着,如果你想要使用一些全局变量或者其他上下文数据,你得自己去搞定。
最后是direct_to_template()
,这个函数在Django的早期版本中比较常用,但现在已经不推荐使用了。它的功能和render()
类似,但没有那么灵活,所以现在大家都更倾向于使用render()
。
总的来说,如果你是新手,建议你直接使用render()
,因为它简单易用,能帮你省去很多麻烦。
那么在什么情况下用哪个呢?一般来说,render()
是最安全的选择,render_to_response()
可以在你需要更细致控制上下文时使用,而direct_to_template()
就可以忽略了,因为它已经过时了。
5 个回答
渲染是
def render(request, *args, **kwargs):
""" Simple wrapper for render_to_response. """
kwargs['context_instance'] = RequestContext(request)
return render_to_response(*args, **kwargs)
其实,render_to_response
和这个没有什么区别,只不过它会把你的上下文包裹起来,这样模板预处理器才能正常工作。
直接渲染模板是一个通用视图。
在这里使用它其实没有什么意义,因为相比于render_to_response
,它在视图函数上会增加一些额外的负担。
为了让Django新手(比如我)更容易理解,下面是Yuri、Fábio和Frost的回答的简单版本——虽然可能简化了,但这是个不错的起点。
render_to_response()
是最早的用法,但几乎每次都需要加上context_instance=RequestContext(request)
,这真是麻烦。direct_to_template()
是专门为在urls.py中使用设计的,不需要在views.py中定义视图,但它也可以在views.py中使用,这样就不用每次都输入RequestContext了。render()
是render_to_response()
的快捷方式,它会自动提供context_instance=Request
....这个功能在Django的开发版本(1.2.1)中可用,但很多人也创建了自己的快捷方式,比如这个、这个,或者最开始让我困惑的Nathans的basic.tools.shortcuts.py。
https://docs.djangoproject.com/en/1.8/topics/http/shortcuts/#render
render(request, template[, dictionary][, context_instance][, content_type][, status][, current_app])
render()
是一个全新的快捷方式,用来替代 render_to_response
,从1.3版本开始就有了。它会自动使用 RequestContext
,我以后肯定会一直用这个。
2020年更新:需要注意的是,render_to_response()
在Django 3.0中被移除了。
https://docs.djangoproject.com/en/1.8/topics/http/shortcuts/#render-to-response
render_to_response(template[, dictionary][, context_instance][, mimetype])¶
render_to_response
是教程中常用的标准渲染函数。如果你想使用 RequestContext
,你需要指定 context_instance=RequestContext(request)
。
direct_to_template
是我在视图中使用的一个通用视图(而不是在URL中使用),因为它和新的 render()
函数一样,自动使用 RequestContext
以及所有的 context_processor
。
不过,direct_to_template
应该避免使用,因为基于函数的通用视图已经不推荐使用了。要么使用 render
,要么使用真正的类,具体可以参考 https://docs.djangoproject.com/en/1.3/topics/generic-views-migration/
我很高兴自己已经很久没有输入过 RequestContext
了。