Django - render()、render_to_response()和direct_to_template()之间有什么区别?

266

对于一个Python/Django的新手,在视图(view)中,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)

这两者有什么区别,如何在不同的情况下选择使用哪一个?

5个回答

201

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是一种通用视图,我在我的视图中使用它(而不是在我的网址中使用),因为像新的render()函数一样,它自动使用RequestContext和所有的context_processor

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

我很高兴我很久很久没有打过RequestContext了。


1
更正。根据文档,render() 在1.3版本中可用。 - AppleGrew
@AppleGrew,好眼力!“社区”修改了我的帖子,指向了具体的分支,同时他们选择了1.4版本。 - Yuji 'Tomita' Tomita
6
请注意:基于函数的通用视图已弃用,而不是基于函数的普通视图。Django附带的通用视图现在使用基于类的视图(TemplateView)进行实现,它们曾经是使用函数实现(direct_to_template等)。我个人更喜欢使用函数实现的视图,但仍然支持,这一点不会改变。 - Nick Zalutskiy

42

对于Django菜鸟(比如我),重新表述Yuri、Fábio和Frost的答案-这几乎肯定是一个简化版,但是是一个很好的起点?

  • render_to_response()是最初的方法,但几乎每次都需要你输入context_instance = RequestContext(request),非常烦人。

  • 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


1
第一个链接(http://www.import-awesome.com/youre-using-rendertoresponse-psh-heres-direct)出现了404错误。 - Lucio
2
是的,在几乎四年前的链接上可能会出现这种情况! - Ryan

26

Render是指

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则没有。


12

来自 Django 文档:

render() 和调用带有 context_instance 参数的 render_to_response() 是相同的,强制使用 RequestContext

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


6

我是一个可以帮助翻译文本的助手。

以下是需要翻译的内容:

只有一点需要注意,以上答案中没有提到。在这段代码中:

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,可以在模板中访问它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接