问题:Django-render(),render_to_response()和direct_to_template()之间有什么区别?
最新的差值(在语言蟒/ django的小白可以理解)在之间的视图render()
,render_to_response()
和direct_to_template()
?
例如,来自Nathan Borror的基本应用示例
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)
有什么区别,在任何特定情况下使用什么?
回答 0
https://docs.djangoproject.com/zh-CN/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/zh-CN/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
s。
但是direct_to_template
应避免使用,因为不建议使用基于函数的通用视图。使用render
还是实际使用的类,请参见https://docs.djangoproject.com/en/1.3/topics/generic-views-migration/
很高兴我很久没输入RequestContext
了。
回答 1
重新定义Yuri,Fábio和Frosts对Django noob(即我)的答案-几乎可以肯定是一个简化,但是一个好的起点?
render_to_response()
是“原版”,但context_instance=RequestContext(request)
几乎所有时间都需要您输入PITA。direct_to_template()
被设计为仅在urls.py中使用,而没有在views.py中定义视图,但是可以在views.py中使用它以避免键入RequestContextrender()
是render_to_response()
自动提供的快捷方式context_instance=Request
…。它在django开发版本(1.2.1)中可用,但许多人创建了自己的快捷方式,例如this,这个或最初让我扔的快捷方式,即Nathans basic.tools。快捷方式
回答 2
渲染为
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
以视图函数的形式存在开销。
回答 3
从django docs:
render()与具有context_instance参数的render_to_response()调用相同,该参数强制使用RequestContext。
direct_to_template
是不同的。这是一个通用视图,它使用数据字典来呈现html,而不需要views.py,您可以在urls.py中使用它。文件在这里
回答 4
我在上面的答案中找不到一个便笺。在此代码中:
context_instance = RequestContext(request)
return render_to_response(template_name, user_context, context_instance)
第三个参数context_instance
实际上是做什么的?作为RequestContext,它设置了一些基本上下文,然后将其添加到中user_context
。因此,模板获取了此扩展上下文。TEMPLATE_CONTEXT_PROCESSORS
在settings.py中指定了要添加的变量。例如,django.contrib.auth.context_processors.auth添加了变量user
和变量perm
,然后可以在模板中访问它们。