Djangoにはデータを一覧するView、ListView
というMixinがあります。
この記事では、Djangoにおける ListView
について解説します。
それはなにか
ListView
は特定のモデルに紐付いて、デフォルトではそのモデルのデータを自動的にすべて取得します。
大量のデータがあるときは注意してください。
ListView
はデフォルトですべてのデータを取得する
しかし、大量のデータがある場合、ページ分割するなどして表示したくなると思います。
その時は、paginated_by
という変数を定義すれば分割されます。
使い方の項で実際に定義してみます。
また、クラスベースビューではお馴染みのget_context_data
メソッドも使用可能です。
どんないいことがあるのか
- モデルに紐付いたデータを自動で取得することができます
- ページネーション(ページ送り)が実装済みです(テンプレートにページネーションを記載する必要はある)
使い方
モデルはこんな感じだと思ってください。
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
from django.views.generic import ListView
from .models import Article
class ArticleListView(ListView):
model = Article
paginated_by = 10
paginated_by
が1ページに表示するレコードの数です。
テンプレートでは、自動で生成される変数 object_list
を使用します。
もしくは、object_list
と同じ内容でモデル名を使用した(モデル名)_list
が使用できます。
今回の例でいうと、モデル名がArticle
なのでarticle_list
が使用可能です。
内容はobject_list
と同じです。
テンプレート名は (モデル名)_list.html
です。
<h1>ListView</h1>
<ul>
{% for a in object_list %}
<li>{{ a.title }}</li>
{% endfor %}
</ul>
<ul>
{% for a in article_list %}
<li>{{ a.title }}</li>
{% endfor %}
</ul>
2種類記述していますが、出力される内容は同じです。
注意点
ページネーションを使用するにはテンプレートにいろいろ記述しなければなりません。
まとめ
クラスベースビューの中ではかなりメジャーで誰もがお世話になると思います。
ただ一覧を表示するだけでなく、get_queryset
メソッドをオーバーライドして絞り込みをかけたりすることができますので使い勝手がとてもよいクラスベースビューです。