データベースの内容を一覧表示したい!という実装はよくありますよね。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
という名前のテンプレートが設定されています。例えば次のような名前です。
モデル名 | デフォルトのテンプレート名 |
---|---|
Book | book_list.html |
BookCategory | bookcategory_list.html |
しかしデフォルトの名前だと、どれが使われているか分かりにくいですし、別の名前にしたいと思うことがよくあります。使われるテンプレート名を変更したい時は、変数の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>
super().get_context_data(**kwargs)
を呼び出して、その結果をcontext
変数に保存context
に'page_title'
というキーで'本一覧'
という値を追加- テンプレート内で
{{ page_title }}
という変数を使用して表示
上記のように、get_context_data
メソッドをオーバーライドすることで、コンテキストデータを簡単に追加することができます。
まとめ
DjangoのListViewの基本的な使い方と実装について紹介しました。
ListViewを使うことで、データベースからオブジェクトを取得し、それを一覧表示するページを簡単に作成することができます。
最低限動くようにするにはmodelだけ設定すればOK。そこから要件に応じてカスタマイズしていきましょう。