Django – render(),render_to_response()和direct_to_template()之间有什么区别?

render()render_to_response()direct_to_template()之间的视图中有什么区别(在python / django noob语言中可以理解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) 

有什么区别,在特定情况下使用什么?

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 ,我将从现在开始使用。


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)


https://docs.djangoproject.com/en/1.8/ref/generic-views/#django-views-generic-simple-direct-to-template

direct_to_template是一个通用的视图,我在我的意见(而不是在我的url)使用,因为像新的render()函数,它会自动使用RequestContext及其所有的context_processor

但是应该避免使用 direct_to_template因为基于function的通用视图已经被弃用了。 使用render或实际的类,请参阅https://docs.djangoproject.com/en/1.3/topics/generic-views-migration/

我很高兴我没有长时间的inputRequestContext

对Yuri,Fábio和Frosts的解释为Django noob(也就是我) – 几乎肯定是一个简化,但是一个好的起点?

  • render_to_response()是“原始的”,但是要求你在几乎所有的时间,一个PITA中放置context_instance=RequestContext(request)

  • direct_to_template()被devise成只在urls.py中使用,没有在views.py中定义的视图,但是它可以在views.py中使用,以避免必须键入RequestContext

  • render()render_to_response()一个快捷方式,可以自动提供context_instance=Request ….它可以在django开发版本(1.2.1)中使用,但是很多已经创build了自己的快捷方式,比如这个 , 这个或者那个最初扔我,Nathans basic.tools.shortcuts.py

渲染是

 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之间确实没有什么区别,除了它包装你的上下文使得模板预处理器工作。

直接到模板是一个通用的视图 。

在这里使用它是没有意义的,因为视图函数的forms对render_to_response有开销。

从Django 文档 :

render()与render_to_response()的调用相同,context_instance参数强制使用RequestContext。

direct_to_template是不同的。 这是一个通用的视图,它使用数据字典来呈现html,而不需要views.py,您可以在urls.py中使用它。 文档在这里

只是一个音符,我无法在上面的答案中find。 在这个代码中:

 context_instance = RequestContext(request) return render_to_response(template_name, user_context, context_instance) 

第三个参数context_instance实际上做了什么? 作为RequestContext,它设置了一些基本的上下文,然后添加到user_context 。 所以模板得到这个扩展的上下文。 settings.py中的TEMPLATE_CONTEXT_PROCESSORS提供了哪些variables。 例如django.contrib.auth.context_processors.auth添加variablesuser和variablesperm ,然后可以在模板中访问。