{"title":"クラスベースビュー","version":"4.1","locale":"ja","docname":"topics/class-based-views/index","url":"/ja/4.1/topics/class-based-views/","canonical":"https://djangodocs.dev/ja/4.1/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/4.1/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/4.1/topics/class-based-views/intro/\">クラスベースビュー入門</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/ja/4.1/topics/class-based-views/generic-display/\">ビルトインのクラスベースのジェネリックビュー</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/ja/4.1/topics/class-based-views/generic-editing/\">クラスベースのビューでフォームを扱う</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/ja/4.1/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/4.1/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/4.1/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/4.1/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/4.1/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/4.1/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/4.1/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>2つ目の、より強力な汎用ビューの使用方法は、既存のビューを継承し、サブクラス内の属性（ <code class=\"docutils literal notranslate\"><span class=\"pre\">template_name``など）やメソッド（</span> <span class=\"pre\">``get_context_data``など）をオーバーライドして、新しい値やメソッドを提供することです。例えば、``about.html</span></code>. というテンプレートを表示するだけのビューを考えてみましょう。Django にはこれを行うための汎用ビュー、<a class=\"reference internal\" href=\"/ja/4.1/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/4.1/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>  は関数ではなくクラスなので、代わりに  <a class=\"reference internal\" href=\"/ja/4.1/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>  クラスメソッドを 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=\"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/4.1/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>\n            <span class=\"c1\"># RFC 1123 date format.</span>\n            <span class=\"n\">headers</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;Last-Modified&#39;</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><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=\"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>Asynchronous class-based views<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<aside class=\"version-note version-added\" data-version=\"4.1\">\n<p class=\"version-note-title\">New in Django 4.1</p></aside>\n<p>As well as the synchronous (<code class=\"docutils literal notranslate\"><span class=\"pre\">def</span></code>) method handlers already shown, <code class=\"docutils literal notranslate\"><span class=\"pre\">View</span></code>\nsubclasses may define asynchronous (<code class=\"docutils literal notranslate\"><span class=\"pre\">async</span> <span class=\"pre\">def</span></code>) method handlers to leverage\nasynchronous code using <code class=\"docutils literal notranslate\"><span class=\"pre\">await</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<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>Within a single view-class, all user-defined method handlers must be either\nsynchronous, using <code class=\"docutils literal notranslate\"><span class=\"pre\">def</span></code>, or all asynchronous, using <code class=\"docutils literal notranslate\"><span class=\"pre\">async</span> <span class=\"pre\">def</span></code>. An\n<code class=\"docutils literal notranslate\"><span class=\"pre\">ImproperlyConfigured</span></code> exception will be raised in <code class=\"docutils literal notranslate\"><span class=\"pre\">as_view()</span></code> if <code class=\"docutils literal notranslate\"><span class=\"pre\">def</span></code>\nand <code class=\"docutils literal notranslate\"><span class=\"pre\">async</span> <span class=\"pre\">def</span></code> declarations are mixed.</p>\n<p>Django will automatically detect asynchronous views and run them in an\nasynchronous context. You can read more about Django's asynchronous support,\nand how to best use async views, in <a class=\"reference internal\" href=\"/ja/4.1/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":"Asynchronous class-based views","anchor":"asynchronous-class-based-views","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Django を使う","url":"/ja/4.1/topics/"}],"prev":{"docname":"topics/templates","title":"テンプレート","url":"/ja/4.1/topics/templates/"},"next":{"docname":"topics/class-based-views/intro","title":"クラスベースビュー入門","url":"/ja/4.1/topics/class-based-views/intro/"},"formats":{"html":"/ja/4.1/topics/class-based-views/","markdown":"/ja/4.1/topics/class-based-views.md","json":"/ja/4.1/topics/class-based-views.json"},"source":"https://github.com/django/django/blob/stable/4.1.x/docs/topics/class-based-views/index.txt","official":"https://docs.djangoproject.com/ja/4.1/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"]}