# Django 5.2.9 ドキュメント

# `TemplateResponse` および `SimpleTemplateResponse`

標準の `HttpResponse` オブジェクトは静的な構造体です。構築時にあらかじめレンダリングされたコンテンツのブロックが提供され、そのコンテンツは変更可能ですが、簡単に変更できる形ではありません。

しかし、デコレータやミドルウェアが、 ビューでレスポンスが作成された後にレスポンスを変更できるようにすることは、 場合によっては有益なこともあります。たとえば、使用するテンプレートを変更したり、追加データをコンテキストに追加したりしたくなるかもしれません。

TemplateResponse はそのための方法を提供します。基本的な `HttpResponse` オブジェクトとは異なり、 TemplateResponse オブジェクトはレスポンスを計算するためにビューから提供されたテンプレートとコンテキストの詳細を保持します。レスポンスの最終的な出力は、レスポンス処理の後半で必要になるまで計算されません。

## `SimpleTemplateResponse` オブジェクト

class SimpleTemplateResponse

### 属性

SimpleTemplateResponse.template_name

  The name of the template to be rendered. Accepts a backend-dependent template object (such as those returned by `get_template()`), the name of a template, or a list of template names.

  例: `['foo.html', 'path/to/bar.html']`

SimpleTemplateResponse.context_data

  テンプレートをレンダリングするときに使用するコンテキストデータ。 これは `dict` でなければなりません。

  例: `{'foo': 123}`

SimpleTemplateResponse.rendered_content

  現在のテンプレートとコンテキストデータを使ってレンダリングされた、レスポンスコンテンツの現在の値。

SimpleTemplateResponse.is_rendered

  レスポンスの内容がレンダリングされたかどうかを示す真偽値。

### メソッド

SimpleTemplateResponse.__init__(template, context=None, content_type=None, status=None, charset=None, using=None, headers=None)

  `SimpleTemplateResponse` オブジェクトを、与えられたテンプレート、コンテキスト、コンテンツタイプ、HTTP ステータス、文字コードでインスタンス化します。

  `template`

    A backend-dependent template object (such as those returned by `get_template()`), the name of a template, or a list of template names.

  `context`

    テンプレートコンテキストに追加する値の `dict` 。デフォルトでは空の辞書です。

  `content_type`

    HTTP の `Content-Type` ヘッダに含まれる値で、MIME タイプ指定と文字セットエンコーディングを含みます。もし `content_type` が指定されていれば、その値が使われます。それ以外の場合は `'text/html'` が使用されます。

  `status`

    レスポンスの HTTP ステータスコード

  `charset`

    レスポンスがエンコードされる文字コード。省略された場合は `content_type` から抽出され、それが失敗した場合は `DEFAULT_CHARSET` の設定が使用されます。

  `using`

    テンプレートを読み込むために使用するテンプレートエンジンの `NAME` を指定します。

  `headers`

    レスポンスに追加するHTTPヘッダーの `dict` 。

SimpleTemplateResponse.resolve_context(context)

  テンプレートのレンダリングに使用されるコンテキストデータを前処理します。コンテキストデータの `dict` を受け取ります。デフォルトでは同じ `dict` を返します。

  コンテキストをカスタマイズするには、このメソッドをオーバーライドします。

SimpleTemplateResponse.resolve_template(template)

  Resolves the template instance to use for rendering. Accepts a backend-dependent template object (such as those returned by `get_template()`), the name of a template, or a list of template names.

  レンダリングするバックエンド依存のテンプレートオブジェクトインスタンスを返します。

  テンプレートの読み込みをカスタマイズするには、このメソッドをオーバーライドします。

SimpleTemplateResponse.add_post_render_callback()

  レンダリングが行われた後に呼び出されるコールバックを追加します。このフックを使用すると、特定の処理 (キャッシュなど) をレンダリングが完了するまで延期できます。

  `SimpleTemplateResponse` がすでにレンダリングされている場合、コールバックは直ちに呼び出されます。

  呼び出されると、コールバックは単一の引数、つまりレンダリングされた `SimpleTemplateResponse` インスタンスを渡されます。

  コールバックが `None` 以外の値を返した場合、元のレスポンスオブジェクトの代わりにこの値がレスポンスとして使用されます（次のレンダリング後コールバックなどに渡されます）。

SimpleTemplateResponse.render()

  `response.content` を `SimpleTemplateResponse.rendered_content` で取得した結果にセットし、全てのレンダリング後コールバックを実行し、結果のレスポンスオブジェクトを返します。

  `render()` は最初に呼び出されたときだけ効果を発揮します。それ以降の呼び出しでは、最初の呼び出しで得られた結果を返します。

## `TemplateResponse` オブジェクト

class TemplateResponse

  `TemplateResponse` は `SimpleTemplateResponse` のサブクラスで、現在の `HttpRequest` について知っています。

### メソッド

TemplateResponse.__init__(request, template, context=None, content_type=None, status=None, charset=None, using=None, headers=None)

  `TemplateResponse` オブジェクトを、与えられたリクエスト、テンプレート、コンテキスト、コンテンツタイプ、HTTP ステータス、文字コードでインスタンス化します。

  `request`

    `HttpRequest` インスタンスです。

  `template`

    A backend-dependent template object (such as those returned by `get_template()`), the name of a template, or a list of template names.

  `context`

    テンプレートコンテキストに追加する値の `dict` 。デフォルトでは空の辞書です。

  `content_type`

    HTTP の `Content-Type` ヘッダに含まれる値で、MIME タイプ指定と文字セットエンコーディングを含みます。もし `content_type` が指定されていれば、その値が使われます。それ以外の場合は `'text/html'` が使用されます。

  `status`

    レスポンスの HTTP ステータスコード

  `charset`

    レスポンスがエンコードされる文字コード。省略された場合は `content_type` から抽出され、それが失敗した場合は `DEFAULT_CHARSET` の設定が使用されます。

  `using`

    テンプレートを読み込むために使用するテンプレートエンジンの `NAME` を指定します。

  `headers`

    レスポンスに追加するHTTPヘッダーの `dict` 。

## レンダリングプロセス

`TemplateResponse` インスタンスをクライアントに返す前に、レンダリングする必要があります。レンダリングプロセスはテンプレートとコンテキストの中間表現を受け取り、クライアントに提供できる最終的なバイトストリームに変えます。

`TemplateResponse` がレンダリングされる状況は3つあります：

- When the `TemplateResponse` instance is explicitly rendered, using the `SimpleTemplateResponse.render()` method.

- レスポンスの内容を `response.content` に代入して明示的にセットした場合。

- テンプレート・レスポンス・ミドルウェアを通過した後、レスポンス・ミドルウェアを通過する前。

`TemplateResponse` は一度しかレンダリングできません。最初に `SimpleTemplateResponse.render()` を呼び出すと、レスポンスの内容がセットされます。それ以降にレンダリングを呼び出しても、レスポンスの内容は変更されません。

しかし、`response.content` を明示的に代入すると、その変更は常に適用されます。コンテンツを強制的に再レンダリングしたい場合は、以下のようにレンダリングされたコンテンツを再評価し、レスポンスのコンテンツを手動で割り当てます：

    # Set up a rendered TemplateResponse
    >>> from django.template.response import TemplateResponse
    >>> t = TemplateResponse(request, "original.html", {})
    >>> t.render()
    >>> print(t.content)
    Original content

    # Re-rendering doesn't change content
    >>> t.template_name = "new.html"
    >>> t.render()
    >>> print(t.content)
    Original content

    # Assigning content does change, no render() call required
    >>> t.content = t.rendered_content
    >>> print(t.content)
    New content

### レンダリング後のコールバック

キャッシュのようないくつかの操作は、レンダリングされていないテンプレートでは実行できません。それらは完全に完成し、レンダリングされたレスポンスに対して実行されなければなりません。

ミドルウェアを使用している場合は、それが可能です。ミドルウェアは、ビューからの終了時にレスポンスを処理する複数の機会を提供します。レスポンスミドルウェアに処理を記述すれば、テンプレートのレンダリングが行われた後に実行されることが保証されます。

しかし、デコレータを使用している場合は、そのような機会はありません。デコレータで定義された処理は、即座に実行されます。

これを避けるために(そして他の類似のユースケースを補うために) `TemplateResponse` ではレンダリングが完了したときに呼び出されるコールバックを登録できます。このコールバックを使うことで、レンダリングされたコンテンツが利用可能になるまで、重要な処理を延期できます。

レンダリング後のコールバックを定義するには、response を引数に取る関数を定義し、その関数をテンプレートの response に登録します：

    from django.template.response import TemplateResponse

    def my_render_callback(response):
        # Do content-sensitive processing
        do_post_processing()

    def my_view(request):
        # Create a response
        response = TemplateResponse(request, "mytemplate.html", {})
        # Register the callback
        response.add_post_render_callback(my_render_callback)
        # Return the response
        return response

`my_render_callback()` は `mytemplate.html` がレンダリングされた後に呼び出され、完全にレンダリングされた `TemplateResponse` インスタンスが引数として渡されます。

テンプレートが既にレンダリングされている場合、コールバックは直ちに呼び出されます。

## `TemplateResponse` および `SimpleTemplateResponse` を使用する

A `TemplateResponse` object can be used anywhere that a normal `django.http.HttpResponse` can be used. It can also be used as an alternative to calling `render()`.

たとえば、以下のビューはテンプレートとクエリセットを含むコンテキストを持つ `TemplateResponse` を返します：

    from django.template.response import TemplateResponse

    def blog_index(request):
        return TemplateResponse(
            request, "entry_list.html", {"entries": Entry.objects.all()}
        )