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

在一个视图中,render()render_to_response()direct_to_template()之间有什么区别(用python/django新手能理解的语言)?

例如,从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)

有什么不同,在特定情况下用什么?

126324 次浏览

django 文档:

render()与调用 Render_to_response () Context_instance参数 强制使用RequestContext.

direct_to_template是不同的。它是一个通用视图,使用数据字典来呈现html,而不需要views.py,你在urls.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编辑:应该注意的是,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)


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

direct_to_template是我在我的视图中使用的通用视图(而不是在我的url中),因为像新的render()函数一样,它自动使用RequestContext及其所有__abc3。

但是direct_to_template 应该避免作为基于函数的泛型视图是不推荐的。使用render或实际的类,参见https://docs.djangoproject.com/en/1.3/topics/generic-views-migration/

我很高兴我很久很久没有输入RequestContext了。

渲染是

def render(request, *args, **kwargs):
""" Simple wrapper for render_to_response. """
kwargs['context_instance'] = RequestContext(request)
return render_to_response(*args, **kwargs)

因此,render_to_responserender_to_response实际上没有区别,除了它包装了你的上下文,使模板预处理器工作。

直接到模板是通用视图

在这里使用它没有任何意义,因为以视图函数的形式存在render_to_response的开销。

换句话说,Yuri, Fábio和Frosts是Django新手(即我)的答案——几乎可以肯定是一个简化,但一个好的起点?

  • render_to_response()是“原始的”,但需要你几乎一直放入context_instance=RequestContext(request),一个PITA。

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

  • render()render_to_response()的快捷方式,自动提供context_instance=Request.... 它在django开发版本(1.2.1)中可用,但许多人已经创建了自己的快捷方式,如这一个这一个或最初让我困惑的那个,nathan basic.tools.shortcuts.py

只有一点我在上面的答案中找不到。在这段代码中:

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

第三个参数context_instance实际上是做什么的?作为RequestContext,它设置了一些基本上下文,然后添加到user_context中。模板得到这个扩展的上下文。添加的变量由settings.py中的TEMPLATE_CONTEXT_PROCESSORS给出。例如django.contrib.auth.context_processors。auth添加变量user和变量perm,然后可以在模板中访问它们。