# Django 5.0.9.dev20240806133106 ドキュメント

# `TemplateResponse` および `SimpleTemplateResponse`

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

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

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

## `SimpleTemplateResponse` オブジェクト

class `SimpleTemplateResponse`

### 属性

`SimpleTemplateResponse.``template_name`

  レンダリングするテンプレートの名前です。 `get_template()` が返すような）バックエンド依存のテンプレートオブジェクト、テンプレート名、またはテンプレート名のリストを受け入れます。

  例: `['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`
    (`get_template()` が返すような) バックエンド依存のテンプレートオブジェクト、テンプレートの名前、またはテンプレート名のリスト。
  `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)

  レンダリングに使用するテンプレートのインスタンスを解決します。(`get_template()` が返すような) バックエンド依存のテンプレートオブジェクト、テンプレート名、またはテンプレート名のリストを受け付けます。

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

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

`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`
    (`get_template()` が返すような) バックエンド依存のテンプレートオブジェクト、テンプレートの名前、またはテンプレート名のリスト。
  `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つあります：

- TemplateResponse インスタンスが `SimpleTemplateResponse.render()` メソッドを使用して明示的にレンダリングされた場合。
- レスポンスの内容を `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` を使用する

`TemplateResponse` オブジェクトは、通常の `django.http.HttpResponse` が使用できる場所ならどこでも使用できます。また、 `render()` を呼び出す代わりとしても使用できます。

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

    from django.template.response import TemplateResponse

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