Django-render()、render_to_response()、direct_to_template()の違いは何ですか?


238

いただきまし差の観点で(言語でのpythonを/ジャンゴnoobのは理解できる)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)

違いは何ですか、特定の状況で何を使用するのですか?

回答:


185

https://docs.djangoproject.com/en/1.8/topics/http/shortcuts/#render

render(request, template[, dictionary][, context_instance][, content_type][, status][, current_app])

render()render_to_response1.3のブランドスパンキングの新しいショートカットです。これは自動的に使用され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、そのすべてのcontext_processor

ただし、関数ベースの汎用ビューは非推奨でdirect_to_template あるため避けくださいrender実際のクラスを使用するか、参照してください https://docs.djangoproject.com/en/1.3/topics/generic-views-migration/をください

RequestContext長い間入力しなかったので嬉しいです。


1
補正。ドキュメントによるとrender()1.3から利用可能です。
AppleGrew、2012年

@AppleGrew、いいキャッチ!「コミュニティ」は特定のブランチを指すように私の投稿を変更し、彼らは1.4を選びました
Yuji 'Tomita' Tomita

6
注:関数ベースの汎用ビューは非推奨であり、関数ベースのビューではありません。Djangoに同梱されているジェネリックビューは、クラスベースのビュー(TemplateView)を使用して実装され、関数(direct_to_templateなど)として実装されていました。関数として実装されたビュー(私の個人的な好み)は引き続きサポートされており、変更されません。
Nick Zalutskiy 2013年

40

ユーリ、ファビオ、フロストの答えをDjango noob(つまり私)に言い換える-ほぼ間違いなく単純化ですが、出発点としては良いでしょうか?

  • render_to_response()「オリジナル」ですがcontext_instance=RequestContext(request)、ほとんど常にPITAを入力する必要があります。

  • direct_to_template()views.pyで定義されたビューなしでurls.pyで使用するように設計されていますが、views.py で使用して、RequestContextを入力する必要をなくすことができます。

  • render()は、render_to_response()自動的に供給されるショートカットcontext_instance=Requestです...。これは、django開発バージョン(1.2.1)で使用できますが、多くは、このショートカット、このショートカット、または最初に私をスローしたNathans basic.toolsなどの独自のショートカットを作成しています。 shortcuts.py


最初のリンク(import-awesome.com/…)は404
Lucio

ええ、それはほぼ4年前のリンクで起こります!
ライアン

24

レンダリングは

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 docsから:

render()は、requestContextの使用を強制するcontext_instance引数を指定したrender_to_response()の呼び出しと同じです。

direct_to_template何か違う。これは、views.pyを使用せずにデータディクショナリを使用してHTMLをレンダリングする汎用ビューです。urls.pyで使用します。ここにドキュメント


6

上記の回答では見つけられなかったメモが1つだけあります。このコードでは:

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

3番目のパラメーターはcontext_instance実際に何をしますか?ビーイングRequestContextには、それはその後に追加されたいくつかの基本的なコンテキストを設定しますuser_context。したがって、テンプレートはこの拡張コンテキストを取得します。追加される変数はTEMPLATE_CONTEXT_PROCESSORS、settings.pyで指定されます。たとえば、django.contrib.auth.context_processors.authは変数userと変数permを追加します。これらはテンプレートでアクセスできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.