MENU

【Django基礎】ListViewの基本的な使い方と実装|クラスベースビュー

汎用ビューListView。基本的な使い方。

データベースの内容を一覧表示したい!という実装はよくありますよね。Djangoには一覧表示を簡単に実装するためにListViewという汎用ビューが用意されています。

しかし汎用ビューはシンプルな実装で使う時は簡単なのですが、少し複雑なことをしようとするとちょっとややこしいことも。

たきさぶ

どこをどう変更するんだっけ?とよくなります。

当ページではListViewの基本から、カスタマイズする方法までサンプルコードを使って解説します。実装の際の参考にしてください!

目次

DjangoのListViewとは?

ListViewはDjangoに用意されている汎用ビューの1つです。

Djangoの汎用ビュー(Generic View)とは効率的にコーディングができるよう、特定の用途を抽象化したクラスのこと。必要な機能がすでに実装されているので、少ないコードで効率的にコードが書けます。

ListViewはデータベース(Model)からクエリセットを取得し、テンプレートに渡して一覧表示させる操作が抽象化されたクラスベースビューです。ブログの投稿一覧や製品のカテゴリー一覧など、特定のデータを表などで一覧表示する場合に使われます。

DangoのListViewの基本的な使い方

ListViewを使うためにはまず初めにインポートする必要があります。

from django.views.generic import ListView

次に、ListViewを継承したクラスを作成します。以下は、最低限の設定で作成したListViewです。

from django.views.generic import ListView
from .models import Book

class BookListView(ListView):
    model = Book

上記の例では、Bookというモデルを一覧表示させるビューを作成しています。

最後にテンプレートで一覧表示してみましょう。テンプレートのフォルダにbook_list.htmlを作成して、以下のコード書きます。

<!DOCTYPE html>
<html>
<head>
  <title>Book List</title>
</head>
<body>
  <h1>Book List</h1>
  <ul>
    {% for object in object_list %}
      <li>{{ object.name }}</li>
    {% endfor %}
  </ul>
</body>
</html>

以上がもっともシンプルなListViewの使い方です。とはいえ、これだけだとちょっと使いにくいですよね。もう少し色々なことできるように、カスタマイズしていきましょう。

DjangoのListViewのカスタマイズ【基本】

ListViewは対象のモデルをmodel変数にセットするだけで利用できます。しかしそれだけだと使いにくいので、使いやすくするようにカスタマイズすることが多いです。

まずは基本的なカスタマイズを使ってクラスベースビューに慣れていきましょう。

template_name:テンプレートのファイル名を変更

ListViewはデフォルトで[モデル名(小文字)]_list.htmlという名前のテンプレートが設定されています。例えば次のような名前です。

モデル名デフォルトのテンプレート名
Bookbook_list.html
BookCategorybookcategory_list.html
ListViewで使われるデフォルトテンプレート名の例

しかしデフォルトの名前だと、どれが使われているか分かりにくいですし、別の名前にしたいと思うことがよくあります。使われるテンプレート名を変更したい時は、変数のtemplate_nameに設定しましょう。

from django.views.generic import ListView
from .models import Book

class BookListView(ListView):
    model = Book
    template_name = 'book/index.html'

context_object_name:モデルのリストを保存するコンテキスト名を変更

ListViewのmodelで指定したモデルの一覧をテンプレートで使う時、デフォルトではobject_listというコンテキスト名で保存されています。なので、テンプレートでは以下のようにforループを使ってデータを取り出します。

{% for object in object_list %}
  {{ object.name }}
{% endfor %}

しかし、テンプレートの中にobject_listとあっても、何を表しているのか分かりにくいですよね。分かりやすい別の名前に変更したい時は、context_object_nameに設定します。

from django.views.generic import ListView
from .models import Book

class BookListView(ListView):
    model = Book
    context_object_name = 'books'
{% for book in books %}
  {{ book.name }}
{% endfor %}

オブジェクトそのものを表す名前に変更すれば、テンプレートでの可読性が上がります。

get_context_data():コンテキストにデータを追加

テンプレートに一覧以外のデータを渡したいときはget_context_dataをオーバーライドして設定します。

以下は、get_context_dataメソッドをオーバーライドしてカスタムコンテキストデータを追加するサンプルコードです。

def get_context_data(self, **kwargs):
    # 元のコンテキストを取得
    context = super().get_context_data(**kwargs)

    # コンテキストを追加
    context['page_title'] = '本一覧'

    # コンテキストを返す
    return context
<h1>{{ page_title }}</h1>
  1. super().get_context_data(**kwargs)を呼び出して、その結果をcontext変数に保存
  2. context'page_title'というキーで'本一覧'という値を追加
  3. テンプレート内で{{ page_title }}という変数を使用して表示

上記のように、get_context_dataメソッドをオーバーライドすることで、コンテキストデータを簡単に追加することができます。

まとめ

DjangoのListViewの基本的な使い方と実装について紹介しました。

ListViewを使うことで、データベースからオブジェクトを取得し、それを一覧表示するページを簡単に作成することができます。

最低限動くようにするにはmodelだけ設定すればOK。そこから要件に応じてカスタマイズしていきましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次