ベース・ビュー

以下の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_classview_initkwargs 属性を持っています。

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

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

setup(request, *args, **kwargs)

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

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

dispatch(request, *args, **kwargs)

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

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

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

http_method_not_allowed(request, *args, **kwargs)

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

プレーンテキストで、有効なメソッドのリストともに、HttpResponseNotAllowed を返すデフォルトの処理です。

options(request, *args, **kwargs)

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

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

TemplateView

class django.views.generic.base.TemplateView

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

継承元 (MRO)

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

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

  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)

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

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

  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 を使います。デフォルトでは、permanentFalse です。

query_string

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

メソッド

get_redirect_url(*args, **kwargs)

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

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

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

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

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

Back to Top