render()
、render_to_response()
和 direct_to_template()
之间的视图有什么区别(python/django noob 可以理解的语言)?
例如来自 Nathan Borror's basic apps examples
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
,我从现在开始肯定会使用它。
2020 年编辑:应该注意的是,在 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
是我在视图中(而不是在我的网址中)使用的通用视图,因为与新的 render()
函数一样,它会自动使用 RequestContext
及其所有 context_processor
。
但是direct_to_template
应该避免,因为基于函数的通用视图已被弃用。使用 render
或实际类,请参阅 https://docs.djangoproject.com/en/1.3/topics/generic-views-migration/
我很高兴很长时间没有输入 RequestContext
。
为 Django 菜鸟(即我)改写 Yuri、Fábio 和 Frosts 的答案——几乎可以肯定是一个简化,但一个好的起点?
render_to_response() 是“原始”,但要求您几乎始终将 context_instance=RequestContext(request) 放入 PITA 中。
direct_to_template() 旨在仅在 urls.py 中使用,而无需在 views.py 中定义视图,但它可以在 views.py 中使用以避免键入 RequestContext
render() 是自动提供 context_instance=Request.. 的 render_to_response() 的快捷方式。它在 django 开发版本 (1.2.1) 中可用,但许多人已经创建了自己的快捷方式,例如这个、这个或那个最初扔给我,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
之间实际上没有区别,只是它包装了您的上下文,使模板预处理器工作。
直接到模板是 generic view。
在这里使用它确实没有任何意义,因为在视图函数的形式中存在超过 render_to_response
的开销。
只有一个注释我在上面的答案中找不到。在这段代码中:
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
,然后可以在模板中访问它们。
不定期副业成功案例分享
render()
从 1.3 开始可用。