# Django 6.0.7 ドキュメント

# ベース・ビュー

以下の3つのクラスは、Django のビューの作成に必要な多くの機能を提供します。これらは Django ビューの 親の ビューとみなすことができ、それ自体で使うことも継承して使うこともできます。プロジェクトに必要な全ての機能を提供するわけではありませんが、その場合はミックスインとクラスベースのジェネリックビューが使えます。

多くの Django に組み込みのクラスベースビューは、ほかのクラスベースビューや多種のミックスインを継承しています。この継承の連結は非常に重要なため、原型のクラスは 継承元 (MRO) セクションにドキュメントがあります。MRO は メソッド解決順序 (Method Resolution Order) の略です。

## `View`

class django.views.generic.base.View

  基本ビュークラス。他の全てのクラスベースのビューはこの基底クラスを継承します。厳密にはジェネリックビューではないので、 `django.views` からインポートすることもできます。

  メソッドのフローチャート

  1. `setup()`

  2. `dispatch()`

  3. `http_method_not_allowed()`

  4. `options()`

  Example views.py:

      from django.http import HttpResponse
      from django.views import View

      class MyView(View):
          def get(self, request, *args, **kwargs):
              return HttpResponse("Hello, World!")

  Example urls.py:

      from django.urls import path

      from myapp.views import MyView

      urlpatterns = [
          path("mine/", MyView.as_view(), name="my-view"),
      ]

  属性

  http_method_names

    このビューが受け入れる HTTP メソッドの名称のリストです。

    デフォルト値:

        ["get", "post", "put", "patch", "delete", "head", "options", "trace"]

  メソッド

  classmethod as_view(**initkwargs)

    リクエストを受け取ってレスポンスを返す、呼び出し可能なビューを返します:

        response = MyView.as_view()(request)

    返されたビューは、`view_class` と `view_initkwargs` 属性を持っています。

    リクエスト/レスポンスサイクル中にビューが呼び出されると、`setup()` メソッドは `HttpRequest` をビューの `request` 属性に割り当て、URLパターンからキャプチャされた位置引数および/またはキーワード引数 をそれぞれ `args` および `kwargs` 属性に割り当てます。その後、`dispatch()` が呼び出されます。

    ビューのサブクラスが非同期 (`async def`) メソッドハンドラを定義している場合、 `as_view()` は返された呼び出し可能オブジェクトをコルーチン関数としてマークします。非同期ハンドラ (`async def`) と同期ハンドラ (`def`) の両方が1つのビュークラスで定義されている場合、 `ImproperlyConfigured` 例外が発生します。

  setup(request, *args, **kwargs)

    `dispatch()` の前に、ビューの初期化のための重要な処理を実行します。

    ビューの `request` 属性には `HttpRequest` を割り当て、 URLパターンからキャプチャされた 位置引数とキーワード引数をそれぞれ `args` 属性と `kwargs` 属性に割り当ててください。

    このメソッドをオーバーライドする場合は、 `super()` を呼び出さなければなりません。

  dispatch(request, *args, **kwargs)

    ビューの `view` 部分 -- `request` 引数と引数を受け取り、HTTPレスポンスを返すメソッドです。

    デフォルトの処理は、HTTP メソッドを調べて、その HTTP メソッドと一致するメソッドに処理を委ねるよう試みます。例えば、`GET` は `get()` に、`POST` は `post()` に委ねられます。

    デフォルトでは、`HEAD` リクエストは `get()` に委ねられます。`HEAD` リクエストを `GET` とは違う方法で操作する必要がある場合は、`head()` メソッドをオーバーライドできます。例えば その他の HTTP メソッドをサポートする を参照してください。

  http_method_not_allowed(request, *args, **kwargs)

    ビューがサポートしていない HTTP メソッドで呼び出された場合は、 代わりにこのメソッドが呼び出されます。

    The default implementation returns `HttpResponseNotAllowed` with the list of allowed methods in the `Allow` header, as required by RFC 7231. The response body is empty.

  options(request, *args, **kwargs)

    OPTIONS HTTP 動詞のためのリクエストへのレスポンスを操作します。ビューの有効な HTTP メソッド名のリストを含む `Allow` ヘッダーとともにレスポンスを返します。

    クラスの他のHTTPメソッドハンドラが非同期 (`async def`) である場合、レスポンスは `await` で使用するコルーチン関数にラップされます。

## `TemplateView`

class django.views.generic.base.TemplateView

  URL 内でキャプチャされたパラメータを含むコンテキストとともに、与えられたテンプレートをレンダリングします。

  継承元 (MRO)

  このメソッドは、以下のビューからメソッドと属性を継承しています:

  - `django.views.generic.base.TemplateResponseMixin`

  - `django.views.generic.base.ContextMixin`

  - `django.views.generic.base.View`

  メソッドのフローチャート

  1. `setup()`

  2. `dispatch()`

  3. `http_method_not_allowed()`

  4. `get_context_data()`

  Example views.py:

      from django.views.generic.base import TemplateView

      from articles.models import Article

      class HomePageView(TemplateView):
          template_name = "home.html"

          def get_context_data(self, **kwargs):
              context = super().get_context_data(**kwargs)
              context["latest_articles"] = Article.objects.all()[:5]
              return context

  Example urls.py:

      from django.urls import path

      from myapp.views import HomePageView

      urlpatterns = [
          path("", HomePageView.as_view(), name="home"),
      ]

  コンテキスト

  - (`ContextMixin` を通じて) ビューに対応した URL パターンからキャプチャされたキーワード引数とともに入力されます。

  - `as_view()` に `extra_context` キーワード引数を使用して、コンテキストを追加することもできます。

## `RedirectView`

class django.views.generic.base.RedirectView

  与えられた URL にリダイレクトします。

  与えられた URL は、辞書形式の文字列フォーマットを含むかもしれず、URL 内でキャプチャされたパラメータに対して追加されます。キーワード追加は (たとえ引数が渡されなくとも) 常に 行われるため、Python がアウトプット上でパーセント文字に変換できるように、URL 内のすべての `"%"` 文字は `"%%"` と書かれなければなりません。

  与えられた URL が `None` の場合、Djangoは `HttpResponseGone` (410) を返します。

  継承元 (MRO)

  このビューは、以下のビューからメソッドと属性を継承します:

  - `django.views.generic.base.View`

  メソッドのフローチャート

  1. `setup()`

  2. `dispatch()`

  3. `http_method_not_allowed()`

  4. `get_redirect_url()`

  Example views.py:

      from django.shortcuts import get_object_or_404
      from django.views.generic.base import RedirectView

      from articles.models import Article

      class ArticleCounterRedirectView(RedirectView):
          permanent = False
          query_string = True
          pattern_name = "article-detail"

          def get_redirect_url(self, *args, **kwargs):
              article = get_object_or_404(Article, pk=kwargs["pk"])
              article.update_counter()
              return super().get_redirect_url(*args, **kwargs)

  Example urls.py:

      from django.urls import path
      from django.views.generic.base import RedirectView

      from article.views import ArticleCounterRedirectView, ArticleDetailView

      urlpatterns = [
          path(
              "counter/<int:pk>/",
              ArticleCounterRedirectView.as_view(),
              name="article-counter",
          ),
          path("details/<int:pk>/", ArticleDetailView.as_view(), name="article-detail"),
          path(
              "go-to-django/",
              RedirectView.as_view(url="https://www.djangoproject.com/"),
              name="go-to-django",
          ),
      ]

  属性

  url

    リダイレクト先の URL です。もしくは、410 (Gone) HTTP エラーを投げる `None` です。

  pattern_name

    リダイレクト先の URL パターンの名前です。このビューのために渡されてきたものと同じ args と kwargs を使って逆引きされます。

  permanent

    リダイレクトがパーマネントかどうかを指定します。ここでの違いは、返される HTTP ステータスコードだけです。`True` の場合、リダイレクトはステータスコード 301 を使います。`False` の場合は、ステータスコード 302 を使います。デフォルトでは、`permanent` は `False` です。

  query_string

    GET クエリ文字列を新しい場所に渡すかどうかを指定します。`True` の場合、クエリ文字列は URL に追加されます。`False` の場合、クエリ文字列は破棄されます。 デフォルトでは、`query_string` は `False` です。

  preserve_request
    New in Django 6.1.

    Whether to preserve the HTTP method and body during the redirect. If `True`, then the redirect will use status code 307 instead of 302, or 308 instead of 301 when `permanent` is `True`. By default, `preserve_request` is `False`.

  メソッド

  get_redirect_url(*args, **kwargs)

    リダイレクトのために、対象の URL を組み立てます。

    `args` と `kwargs` 引数は、それぞれ URL パターン から取得した、位置引数および/またはキーワード引数です。

    デフォルトの処理は、`url` を最初の文字列として使い、URLでキャプチャされた名前付きグループを使用したその文字列内の名前付き `%` パラメータの展開を実行します。

    `url` がセットされていない場合、`get_redirect_url()` が URLでキャプチャされたものを使って `pattern_name` を逆引きしようとします (名前あり・名前なしグループの両方が使われます)。

    `query_string` によってリクエストされた場合、生成された URL にクエリ文字列を追加します。サブクラスは、メソッドがリダイレクト準備ができた URL 文字列を返す限り、これらが望むとおりの処理をします。