汎用ビューを使用したデータの表示

完了

Django の汎用ビュー システムにより、反復的なコードの作成が合理化されます。 データ ドリブン アプリケーションで実行する一般的な操作では、同じパターンを共有します。 たとえば、ID または主キーによって個々の項目を表示する場合、ワークフローは常に次のようになります。

  1. ID を使ってデータベースから項目を読み込みます。
  2. 項目が見つからない場合は、404 を返します。
  3. 項目が見つかった場合は、表示するテンプレートに項目を渡します。

汎用ビュー システムでは、この事実が確認され、既に記述されているコア コードを含む使用できるクラスが提供されます。 適切なクラスから継承し、いくつかのプロパティを設定してから、URLconf に適切なパスを登録します。 残りの処理は自動的に行われます。

Django には、データを表示するための 2 つの汎用ビュー DetailView および ListView が含まれています。

項目の詳細のための DetailView

汎用ビュー DetailView は、項目の詳細ページを表示するために使用されます。 DetailView では、主キーによって指定された model の項目を取得し、それをテンプレートに渡します。 使用するテンプレートの名前を template_name に設定できます。 既定値は、<model>_detail.html です。 最後に、 テンプレートで使用する変数の名前を context_object_name に設定できます。

犬の汎用ビューを使用して詳細ビューを作成するには、次のコードを使用します。

from . import models
from django.views import generic

class DogDetailView(generic.DetailView):
    model = models.Dog
    template_name = 'dog_detail.html'
    context_object_name = 'dog'

DogDetailView の登録は、他の path エントリに似ています。 含めるための重要なのは、pk という名前のパラメーターです。 Django では、この規則を使用して主キーが識別されます。 また、as_view() メソッドを使用して、クラスをビューに変換することにも注意してください。

path('dog/<int:pk>', views.DogDetailView.as_view(), name='dog_detail')

項目の一覧のための ListView

汎用ビュー ListView は、 DetailView と同様の方法で動作します。 ビュー内の変数の名前に context_object_name を設定し、テンプレートの名前に template_name を設定できます。

主な違いは、 ListView は複数の項目を返す任意の形式のクエリで動作するように設計されていることです。 そのため、get_queryset 関数をオーバーライドする必要があります。 関数 get_queryset は、 汎用ビュー システムによって呼び出され、データベースから項目を取得します。これにより、必要に応じて項目の順序付けやフィルター処理を行うことができます。

汎用ビュー ListView を使用してすべてのシェルターのリストを表示するビューを作成するには、次のコードを使用できます。

from . import models
from django.views import generic

class ShelterListView(generic.ListView):
    template_name = 'shelter_list.html'
    context_object_name = 'shelters'

    def get_queryset(self):
        return models.Shelter.objects.all()

ビューの登録は、DetailView とほとんど同じ方法で実行されます。

path('', ShelterListView.as_view(), name='shelter_list')