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メソッドをオーバーライドして絞り込みをかけたりすることができますので使い勝手がとてもよいクラスベースビューです。