Django - render()、render_to_response() 和 direct_to_template() 有什么区别?
Django - render()、render_to_response() 和 direct_to_template() 有什么区别?
什么是render()
、render_to_response()
和direct_to_template()
之间的区别(对于Python/Django新手来说)?
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)
它们的区别是什么,在任何特定情况下应该使用哪一种?
重新表述Yuri,Fábio和Frost对于Django新手(即我)的回答-几乎肯定是一个简化,但是一个很好的起点?
-
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()
是一个全新的快捷方式,用于1.3版本的render_to_response
,它将自动使用RequestContext
,我从现在开始一定会使用它。
2020年 EDIT:应注意,在Django 3.0中删除了render_to_response()
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
是一个通用视图,我在我的视图中使用它(而不是在我的urls中使用),因为像新的render()
函数一样,它会自动使用RequestContext
和所有它的context_processor
。
但是,应避免使用direct_to_template
,因为函数型通用视图已被弃用。请使用render
或实际的类,请参见https://docs.djangoproject.com/en/1.3/topics/generic-views-migration/
我很高兴我已经很长时间没有打过RequestContext
。