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)
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
,然后可以在模板中访问。