クラスベースのビュー
ビューは、要求を受け取り、応答を返す呼び出し可能オブジェクトです。 これは単なる関数ではなく、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()に渡された引数はすべて、クラスに設定された属性をオーバーライドします。 この例では、TemplateView
にtemplate_name
を設定します。 RedirectView のurl
属性にも、同様のオーバーライドパターンを使用できます。
ジェネリックビューのサブクラス化
汎用ビューを使用する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
ヘッダーは最新の書籍がいつ発行されたかを示します。 この情報に基づいて、クライアントは完全なオブジェクトリストをダウンロードする場合としない場合があります。