ベース・ビュー¶
以下の3つのクラスは、Django のビューの作成に必要な多くの機能を提供します。これらは Django ビューの 親の ビューとみなすことができ、それ自体で使うことも継承して使うこともできます。プロジェクトに必要な全ての機能を提供するわけではありませんが、その場合はミックスインとクラスベースのジェネリックビューが使えます。
多くの Django に組み込みのクラスベースビューは、ほかのクラスベースビューや多種のミックスインを継承しています。この継承の連結は非常に重要なため、原型のクラスは 継承元 (MRO) セクションにドキュメントがあります。MRO は メソッド解決順序 (Method Resolution Order) の略です。
View¶
- class django.views.generic.base.View¶
基本ビュークラス。他の全てのクラスベースのビューはこの基底クラスを継承します。厳密にはジェネリックビューではないので、
django.viewsからインポートすることもできます。メソッドのフローチャート
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
HttpResponseNotAllowedwith the list of allowed methods in theAllowheader, 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)
このメソッドは、以下のビューからメソッドと属性を継承しています:
メソッドのフローチャート
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)
このビューは、以下のビューからメソッドと属性を継承します:
メソッドのフローチャート
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 whenpermanentisTrue. By default,preserve_requestisFalse.
メソッド
- get_redirect_url(*args, **kwargs)¶
リダイレクトのために、対象の URL を組み立てます。
argsとkwargs引数は、それぞれ URL パターン から取得した、位置引数および/またはキーワード引数です。デフォルトの処理は、
urlを最初の文字列として使い、URLでキャプチャされた名前付きグループを使用したその文字列内の名前付き%パラメータの展開を実行します。urlがセットされていない場合、get_redirect_url()が URLでキャプチャされたものを使ってpattern_nameを逆引きしようとします (名前あり・名前なしグループの両方が使われます)。query_stringによってリクエストされた場合、生成された URL にクエリ文字列を追加します。サブクラスは、メソッドがリダイレクト準備ができた URL 文字列を返す限り、これらが望むとおりの処理をします。