{"title":"クラスベースビュー","version":"2.0","locale":"ja","docname":"topics/class-based-views/index","url":"/ja/2.0/topics/class-based-views/","canonical":"https://djangodocs.dev/ja/2.0/topics/class-based-views/","summary":"ビューとは、リクエストを受け取りレスポンスを返す、呼び出し可能なオブジェクトです。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>ビューとは、リクエストを受け取りレスポンスを返す、呼び出し可能なオブジェクトです。Djangoは、関数だけでなく、クラスを使ったビューの例もいくつか用意しています。これらのクラスは、ビューを構造化し、継承とミックスインを利用してコードを再利用することを可能にします。この後見ることになる、単純なタスクのための汎用ビューもいくつかありますが、各自のユースケースに合った、再利用可能なビューの構造を設計したいかもしれませんね。完全な詳細に関しては <a class=\"reference internal\" href=\"/ja/2.0/ref/class-based-views/\"><span class=\"doc\">class-based views reference documentation</span></a> を参照してください。</p>\n<div class=\"toctree-wrapper compound\">\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/ja/2.0/topics/class-based-views/intro/\">クラスベースビュー入門</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/ja/2.0/topics/class-based-views/generic-display/\">ビルトインのクラスベースのジェネリックビュー</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/ja/2.0/topics/class-based-views/generic-editing/\">クラスベースのビューでフォームを扱う</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/ja/2.0/topics/class-based-views/mixins/\">クラスベースのビューでミックスインを使用する</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/2.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/2.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/2.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=\"simple-usage-in-your-urlconf\">\n<h2>URLconf での簡単な使用例<a class=\"heading-anchor\" href=\"#simple-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/2.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=\"s1\">&#39;about/&#39;</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/2.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/2.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/2.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<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/2.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/2.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=\"s1\">&#39;about/&#39;</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/2.0/topics/class-based-views/generic-display/\"><span class=\"doc\">generic class-based views</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=\"s1\">&#39;books/&#39;</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<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=\"s1\">&#39;publication_date&#39;</span><span class=\"p\">)</span>\n        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"s1\">&#39;&#39;</span><span class=\"p\">)</span>\n        <span class=\"c1\"># RFC 1123 date format</span>\n        <span class=\"n\">response</span><span class=\"p\">[</span><span class=\"s1\">&#39;Last-Modified&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</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><span class=\"s1\">&#39;</span><span class=\"si\">%a</span><span class=\"s1\">, </span><span class=\"si\">%d</span><span class=\"s1\"> %b %Y %H:%M:%S GMT&#39;</span><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> テンプレートを使用して) シンプルなプレインテキストのオブジェクトリストが返されます。しかし、クライアントが <code class=\"docutils literal notranslate\"><span class=\"pre\">HEAD</span></code> リクエストを発行した場合には、レスポンスの body は空にし、<code class=\"docutils literal notranslate\"><span class=\"pre\">Last-Modified</span></code> ヘッダに本が最後に出版された時刻を設定して返します。この情報を使うことで、クライアントはオブジェクトのリスト全体をダウンロードするかどうかを判断できるようになります。</p>\n</section>\n</section>","rootId":"class-based-views","toc":[{"title":"基本的な例","anchor":"basic-examples","children":[]},{"title":"URLconf での簡単な使用例","anchor":"simple-usage-in-your-urlconf","children":[]},{"title":"ジェネリックビューのサブクラス化","anchor":"subclassing-generic-views","children":[{"title":"その他の HTTP メソッドをサポートする","anchor":"supporting-other-http-methods","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Django を使う","url":"/ja/2.0/topics/"}],"prev":{"docname":"topics/templates","title":"テンプレート","url":"/ja/2.0/topics/templates/"},"next":{"docname":"topics/class-based-views/intro","title":"クラスベースビュー入門","url":"/ja/2.0/topics/class-based-views/intro/"},"formats":{"html":"/ja/2.0/topics/class-based-views/","markdown":"/ja/2.0/topics/class-based-views.md","json":"/ja/2.0/topics/class-based-views.json"},"source":"https://github.com/django/django/blob/stable/2.0.x/docs/topics/class-based-views/index.txt","official":"https://docs.djangoproject.com/ja/2.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","pt-br","ko","es","el","pl"]}