クラスベースのビュー—Djangoドキュメント

提供:Dev Guides
< DjangoDjango/docs/3.2.x/topics/class-based-views/index
移動先:案内検索

クラスベースのビュー

ビューは、要求を受け取り、応答を返す呼び出し可能オブジェクトです。 これは単なる関数ではなく、Djangoはビューとして使用できるいくつかのクラスの例を提供します。 これらを使用すると、継承とミックスインを利用して、ビューを構造化し、コードを再利用できます。 後で説明するタスクの一般的なビューもいくつかありますが、ユースケースに適した再利用可能なビューの独自の構造を設計することをお勧めします。 詳細については、クラスベースのビューのリファレンスドキュメントを参照してください。

基本的な例

Djangoは、幅広いアプリケーションに適したベースビュークラスを提供します。 すべてのビューは、 View クラスを継承します。このクラスは、ビューのURLへのリンク、HTTPメソッドのディスパッチ、およびその他の一般的な機能を処理します。 redirectView はHTTPリダイレクトを提供し、 TemplateView は基本クラスを拡張して、テンプレートもレンダリングするようにします。


URLconfでの使用法

汎用ビューを使用する最も直接的な方法は、URLconfで直接作成することです。 クラスベースのビューでいくつかの属性のみを変更する場合は、それらを as_view()メソッド呼び出し自体に渡すことができます。

from django.urls import path
from django.views.generic import TemplateView

urlpatterns = [
    path('about/', TemplateView.as_view(template_name="about.html")),
]

as_view()に渡された引数はすべて、クラスに設定された属性をオーバーライドします。 この例では、TemplateViewtemplate_nameを設定します。 RedirectViewurl属性にも、同様のオーバーライドパターンを使用できます。


ジェネリックビューのサブクラス化

汎用ビューを使用する2番目のより強力な方法は、既存のビューから継承し、サブクラスの属性(template_nameなど)またはメソッド(get_context_dataなど)をオーバーライドして新しい値を提供することです。またはメソッド。 たとえば、1つのテンプレートabout.htmlのみを表示するビューについて考えてみます。 Djangoには、これを行うための汎用ビュー( TemplateView )があるため、サブクラス化して、テンプレート名をオーバーライドできます。

# some_app/views.py
from django.views.generic import TemplateView

class AboutView(TemplateView):
    template_name = "about.html"

次に、この新しいビューをURLconfに追加する必要があります。 TemplateView は関数ではなくクラスであるため、代わりに as_view()クラスメソッドをURLで指定します。これにより、クラスベースのビューに関数のようなエントリが提供されます。

# urls.py
from django.urls import path
from some_app.views import AboutView

urlpatterns = [
    path('about/', AboutView.as_view()),
]

組み込みの汎用ビューの使用方法の詳細については、汎用クラスベースのビューに関する次のトピックを参照してください。

他のHTTPメソッドのサポート

ビューをAPIとして使用して、誰かがHTTP経由で本のライブラリにアクセスしたいとします。 APIクライアントは時々接続し、前回の訪問以降に発行された本の本データをダウンロードします。 しかし、それ以降に新しい本が表示されない場合、データベースから本をフェッチし、完全な応答をレンダリングしてクライアントに送信するのは、CPU時間と帯域幅の無駄です。 最新の本がいつ出版されたかをAPIに尋ねることが望ましいかもしれません。

URLconfのブックリストビューにURLをマップします。

from django.urls import path
from books.views import BookListView

urlpatterns = [
    path('books/', BookListView.as_view()),
]

そしてビュー:

from django.http import HttpResponse
from django.views.generic import ListView
from books.models import Book

class BookListView(ListView):
    model = Book

    def head(self, *args, **kwargs):
        last_book = self.get_queryset().latest('publication_date')
        response = HttpResponse(
            # RFC 1123 date format.
            headers={'Last-Modified': last_book.publication_date.strftime('%a, %d %b %Y %H:%M:%S GMT')},
        )
        return response

GET要求からビューにアクセスすると、応答でオブジェクトリストが返されます(book_list.htmlテンプレートを使用)。 ただし、クライアントがHEAD要求を発行した場合、応答の本文は空になり、Last-Modifiedヘッダーは最新の書籍がいつ発行されたかを示します。 この情報に基づいて、クライアントは完全なオブジェクトリストをダウンロードする場合としない場合があります。