{"title":"クラスベースビュー","version":"5.0","locale":"ja","docname":"topics/class-based-views/index","url":"/ja/5.0/topics/class-based-views/","canonical":"https://djangodocs.dev/ja/5.0/topics/class-based-views/","summary":"ビューはリクエストを受けてレスポンスを返す callable です。これは単なる関数以上のものになる可能性があり、Django…","html":"<h1>クラスベースビュー<a class=\"heading-anchor\" href=\"#class-based-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>ビューはリクエストを受けてレスポンスを返す callable です。これは単なる関数以上のものになる可能性があり、Django ではビューとして使用できるいくつかのクラスの例を提供しています。これらのクラスは、継承やミックスインを利用してビューを構造化し、コードを再利用することを可能にします。後ほど説明するタスクのための汎用的なビューもありますが、あなたのユースケースに合った再利用可能なビューの構造を独自に設計したいと思うかもしれません。詳細については、クラスベースのビューの <a class=\"reference internal\" href=\"/ja/5.0/ref/class-based-views/\"><span class=\"doc\">リファレンスドキュメント</span></a> を参照してくださ</p>\n<div class=\"toctree-wrapper compound\">\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/ja/5.0/topics/class-based-views/intro/\">クラスベースビュー入門</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/ja/5.0/topics/class-based-views/generic-display/\">組み込みのクラスベースのジェネリックビュー（汎用ビュー）</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/ja/5.0/topics/class-based-views/generic-editing/\">クラスベースのビューでフォームを扱う</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/ja/5.0/topics/class-based-views/mixins/\">クラスベースのビューでミックスイン (mixin) を使用する</a></li>\n</ul>\n</div>\n<section id=\"basic-examples\">\n<h2>基本的な例<a class=\"heading-anchor\" href=\"#basic-examples\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django は、さまざまなアプリケーションに広く適用できるベースビュークラスを用意しています。 <a class=\"reference internal\" href=\"/ja/5.0/ref/class-based-views/base/#django.views.generic.base.View\" title=\"django.views.generic.base.View\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">View</span></code></a> クラスを継承したすべてのビューは、指定した URL へのビューのリンクや、送り出す HTTP メソッド、その他よく使われる機能をハンドリングします。 <a class=\"reference internal\" href=\"/ja/5.0/ref/class-based-views/base/#django.views.generic.base.RedirectView\" title=\"django.views.generic.base.RedirectView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RedirectView</span></code></a> は HTTP リダイレクトを行うビュークラス、 <a class=\"reference internal\" href=\"/ja/5.0/ref/class-based-views/base/#django.views.generic.base.TemplateView\" title=\"django.views.generic.base.TemplateView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TemplateView</span></code></a> はベースビューを拡張してテンプレートレンダリングの機能をもたせたビュークラスです。</p>\n</section>\n<section id=\"usage-in-your-urlconf\">\n<h2>URLconfでの使用法<a class=\"heading-anchor\" href=\"#usage-in-your-urlconf\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>ジェネリックビューを使用する最もダイレクトな方法は、URLconf 内で直接オブジェクトを作成することです。クラスベースビューの属性をいくつか変更するだけなら、 <a class=\"reference internal\" href=\"/ja/5.0/ref/class-based-views/base/#django.views.generic.base.View.as_view\" title=\"django.views.generic.base.View.as_view\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">as_view()</span></code></a> のメソッド呼び出しに渡せばよいのです。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">path</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.generic</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">TemplateView</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;about/&quot;</span><span class=\"p\">,</span> <span class=\"n\">TemplateView</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">(</span><span class=\"n\">template_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;about.html&quot;</span><span class=\"p\">)),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/ja/5.0/ref/class-based-views/base/#django.views.generic.base.View.as_view\" title=\"django.views.generic.base.View.as_view\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">as_view()</span></code></a> に渡されたすべての引数は、クラスで設定された属性を上書きします。次の例では <code class=\"docutils literal notranslate\"><span class=\"pre\">TemplateView</span></code> の <code class=\"docutils literal notranslate\"><span class=\"pre\">template_name</span></code> を設定しています。同様の上書きのパターンは、<a class=\"reference internal\" href=\"/ja/5.0/ref/class-based-views/base/#django.views.generic.base.RedirectView\" title=\"django.views.generic.base.RedirectView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RedirectView</span></code></a> の <code class=\"docutils literal notranslate\"><span class=\"pre\">url</span></code> 属性でも使えます。</p>\n</section>\n<section id=\"subclassing-generic-views\">\n<h2>ジェネリックビューのサブクラス化<a class=\"heading-anchor\" href=\"#subclassing-generic-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>次に、ジェネリックビューのもっと強力な使用例として、既存のビューを継承して、新しい値やメソッドを提供するために、 <code class=\"docutils literal notranslate\"><span class=\"pre\">template_name</span></code> などの属性や <code class=\"docutils literal notranslate\"><span class=\"pre\">get_context_data</span></code> などのメソッドをサブクラスで上書きする方法を紹介します。たとえば、1つのテンプレート <code class=\"docutils literal notranslate\"><span class=\"pre\">about.html</span></code> だけを表示するビューを作ることを考えてみてください。Django には、このために利用できるジェネリックビュー <a class=\"reference internal\" href=\"/ja/5.0/ref/class-based-views/base/#django.views.generic.base.TemplateView\" title=\"django.views.generic.base.TemplateView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TemplateView</span></code></a> があるので、これをサブクラス化し、テンプレート名を上書きすることで実装できます。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># some_app/views.py</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.generic</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">TemplateView</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AboutView</span><span class=\"p\">(</span><span class=\"n\">TemplateView</span><span class=\"p\">):</span>\n    <span class=\"n\">template_name</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;about.html&quot;</span>\n</code></pre></div>\n<p>あとは、URLconf にこの新しいビューを追加する必要があります。 <a class=\"reference internal\" href=\"/ja/5.0/ref/class-based-views/base/#django.views.generic.base.TemplateView\" title=\"django.views.generic.base.TemplateView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TemplateView</span></code></a> は1つのクラスであって、関数ではありません。そのため、指定する URL に対して、代わりに <a class=\"reference internal\" href=\"/ja/5.0/ref/class-based-views/base/#django.views.generic.base.View.as_view\" title=\"django.views.generic.base.View.as_view\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">as_view()</span></code></a> クラスメソッドを設定しています。これによって、クラスベースビューに対する関数ライクな要素を指定できます。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># urls.py</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">path</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">some_app.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">AboutView</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;about/&quot;</span><span class=\"p\">,</span> <span class=\"n\">AboutView</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">()),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>組み込みの汎用ビューの使用方法の詳細については、次のトピック <a class=\"reference internal\" href=\"/ja/5.0/topics/class-based-views/generic-display/\"><span class=\"doc\">汎用のクラスベースビュー</span></a> を参照してください。</p>\n<section id=\"supporting-other-http-methods\">\n<span id=\"id1\"></span><h3>その他の HTTP メソッドをサポートする<a class=\"heading-anchor\" href=\"#supporting-other-http-methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>誰かが私たちのライブラリに HTTP 経由でアクセスして、ビューを API として使用したいという状況を考えてください。API クライアントはたびたびコネクションを張り、最終訪問日時以降に出版された本のデータをダウンロードするとします。しかし、新しい本の情報が存在しない場合には、データベースから本のデータを取得し、レスポンステキストをレンダリングし、クライアントに送信し返すための CPU タイムとバンド幅は無駄になってしまいます。最新の本が出版された時点で API に問い合わせた方が好ましいかもしれません。</p>\n<p>そのために、URLconf 内で、本のリストビューへの URL を次のようにマッピングします。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">path</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">books.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BookListView</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;books/&quot;</span><span class=\"p\">,</span> <span class=\"n\">BookListView</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">()),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>そして、ビューには次のように書きます。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.generic</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ListView</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">books.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Book</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">BookListView</span><span class=\"p\">(</span><span class=\"n\">ListView</span><span class=\"p\">):</span>\n    <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Book</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">head</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"n\">last_book</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_queryset</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">latest</span><span class=\"p\">(</span><span class=\"s2\">&quot;publication_date&quot;</span><span class=\"p\">)</span>\n        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span>\n            <span class=\"c1\"># RFC 1123 date format.</span>\n            <span class=\"n\">headers</span><span class=\"o\">=</span><span class=\"p\">{</span>\n                <span class=\"s2\">&quot;Last-Modified&quot;</span><span class=\"p\">:</span> <span class=\"n\">last_book</span><span class=\"o\">.</span><span class=\"n\">publication_date</span><span class=\"o\">.</span><span class=\"n\">strftime</span><span class=\"p\">(</span>\n                    <span class=\"s2\">&quot;</span><span class=\"si\">%a</span><span class=\"s2\">, </span><span class=\"si\">%d</span><span class=\"s2\"> %b %Y %H:%M:%S GMT&quot;</span>\n                <span class=\"p\">)</span>\n            <span class=\"p\">},</span>\n        <span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"n\">response</span>\n</code></pre></div>\n<p>ビューが <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> リクエストからアクセスされた場合、レスポンスにはオブジェクトリストが返されます( <code class=\"docutils literal notranslate\"><span class=\"pre\">book_list.html</span></code> テンプレートを使用しています)。しかし、クライアントがHEADリクエストを発行した場合、レスポンスは空のボディを持ち、 <code class=\"docutils literal notranslate\"><span class=\"pre\">Last-Modified</span></code> ヘッダーは最新の書籍がいつ発行されたかを示します。この情報に基づいて、クライアントは完全なオブジェクトリストをダウンロードするかどうかを判断します。</p>\n</section>\n</section>\n<section id=\"asynchronous-class-based-views\">\n<span id=\"async-class-based-views\"></span><h2>非同期のクラスベース・ビュー<a class=\"heading-anchor\" href=\"#asynchronous-class-based-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>既に示した同期 (<code class=\"docutils literal notranslate\"><span class=\"pre\">def</span></code>) メソッドハンドラと同様に、 <code class=\"docutils literal notranslate\"><span class=\"pre\">View</span></code> サブクラスは <code class=\"docutils literal notranslate\"><span class=\"pre\">await</span></code>: を使用して非同期 (<code class=\"docutils literal notranslate\"><span class=\"pre\">async</span> <span class=\"pre\">def</span></code>) メソッドハンドラを定義できます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">asyncio</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">View</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AsyncView</span><span class=\"p\">(</span><span class=\"n\">View</span><span class=\"p\">):</span>\n    <span class=\"k\">async</span> <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Perform io-blocking view logic using await, sleep for example.</span>\n        <span class=\"k\">await</span> <span class=\"n\">asyncio</span><span class=\"o\">.</span><span class=\"n\">sleep</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"s2\">&quot;Hello async world!&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>1つのビュークラス内では、すべてのユーザー定義メソッドハンドラは <code class=\"docutils literal notranslate\"><span class=\"pre\">def</span></code> を使用した同期的なものか、 <code class=\"docutils literal notranslate\"><span class=\"pre\">async</span> <span class=\"pre\">def</span></code> を使用した非同期的なものでなければなりません。 <code class=\"docutils literal notranslate\"><span class=\"pre\">def</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">async</span> <span class=\"pre\">def</span></code> が混在している場合、 <code class=\"docutils literal notranslate\"><span class=\"pre\">as_view()</span></code> で <code class=\"docutils literal notranslate\"><span class=\"pre\">ImproperlyConfigured</span></code> 例外が発生します。</p>\n<p>Django は自動的に非同期ビューを検出し、非同期コンテキストで実行します。Django の非同期サポートや、非同期ビューの最適な使い方については、 <a class=\"reference internal\" href=\"/ja/5.0/topics/async/\"><span class=\"doc\">非同期サポート</span></a> を参照してください。</p>\n</section>","rootId":"class-based-views","toc":[{"title":"基本的な例","anchor":"basic-examples","children":[]},{"title":"URLconfでの使用法","anchor":"usage-in-your-urlconf","children":[]},{"title":"ジェネリックビューのサブクラス化","anchor":"subclassing-generic-views","children":[{"title":"その他の HTTP メソッドをサポートする","anchor":"supporting-other-http-methods","children":[]}]},{"title":"非同期のクラスベース・ビュー","anchor":"asynchronous-class-based-views","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Django を使う","url":"/ja/5.0/topics/"}],"prev":{"docname":"topics/templates","title":"テンプレート","url":"/ja/5.0/topics/templates/"},"next":{"docname":"topics/class-based-views/intro","title":"クラスベースビュー入門","url":"/ja/5.0/topics/class-based-views/intro/"},"formats":{"html":"/ja/5.0/topics/class-based-views/","markdown":"/ja/5.0/topics/class-based-views.md","json":"/ja/5.0/topics/class-based-views.json"},"source":"https://github.com/django/django/blob/stable/5.0.x/docs/topics/class-based-views/index.txt","official":"https://docs.djangoproject.com/ja/5.0/topics/class-based-views/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}