クラスベースビューであるListView(リストのビュー)を利用して、モデルのレコード一覧表示画面を作成してみます。
クラスベースビューについては下記のページをご覧下さい。
下記のMemberモデルを利用しています。なおアプリケーションの名前はuserです。
user/models.py
1 2 3 4 5 6 7 8 9 |
from django.db import models class Member(models.Model): name = models.CharField(max_length=100) age = models.IntegerField() def __str__(self): return self.name |
以下のコードによって、登録されたデータベースのレコード一覧を表示させることができます(下記表示例の画像は既に5件のレコードを登録した様子です。)。テンプレート名はmember_list.htmlのように「モデル名_list.html」として命名されていることに注意して下さい。
user/views.py
1 2 3 4 5 6 7 |
from django.shortcuts import render from .models import Member from django.views.generic import ListView class MemberList(ListView): model = Member |
user/urls.py
1 2 3 4 5 6 |
from django.urls import path from . import views urlpatterns = [ path('', views.MemberList.as_view(), name='member'), ] |
user/templates/user/member_list.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>ListViewサンプル</title> </head> <body> <table border="1"> <tr> <th>name</th> <th>age</th> </tr> {% for member in object_list %} <tr> <td>{{ member.name }}</td> <td>{{ member.age }}</td> </tr> {% endfor %} </table> </body> </html> |
表示例
説明
上述したコードを少しずつ編集していく形で説明していきます。
user/views.py
1 2 3 4 5 6 7 8 |
from django.shortcuts import render from .models import Member from django.views.generic import ListView class MemberList(ListView): template_name = 'user/member_list.html' model = Member |
7行目でtemplate_nameに利用するテンプレートを指定していますが、デフォルトでは「アプリ名/モデル名_list.html」が設定されているので特に記述する必要はありません。
またmember_list.htmlテンプレートの15行目においてobject_listと記述していますが、このobject_listはMemberオブジェクトが含まれている変数のデフォルト名です。もしobject_listという名前ではなく、例えばmember_listのような別の名前にしたい場合は、下記のようにcontext_object_nameを記述します。
1 2 3 |
class MemberList(ListView): context_object_name = 'member_list' model = Member |
1 |
{% for member in member_list %} |
paginate_byについて
paginate_byは、本記事では説明しませんがページネーションを実装する場合に必要となります。仮に下記のように記述すると3件のレコード(オブジェクト)のみ表示されます。
1 2 3 |
class MemberList(ListView): model = Member paginate_by = 3 |
QuerySet(クエリセット)について
model = Memberは、Memberのすべてのリストを取得するクエリを指定した下記のコードと同等です。モデルのManagerであるobjectsに対してall()ですべてのデータを取得しています(Memberオブジェクトすべてを含んだQuerySetを返している)。
1 2 |
class MemberList(ListView): queryset = Member.objects.all() |
order_by()メソッドの引数にフィールド名を指定して、並びを変えることができます。-(マイナス)をつけると降順になります。
1 2 |
class MemberList(ListView): queryset = Member.objects.order_by('-age') |
filter()メソッドによってフィルタリングできます。ageが23のレコードのみを表示させています。
1 2 |
class MemberList(ListView): queryset = Member.objects.filter(age='23') |
他にも様々なメソッドが存在します。Methods that return new QuerySets をご参照下さい。
get_queryset()について
上述してきたquerysetは、get_queryset()メソッドによって下記のように書き換えれます。
queryset = Member.objects.all() と同じ。
1 2 3 |
class MemberList(ListView): def get_queryset(self): return Member.objects.all() |
queryset = Member.objects.order_by(‘-age’) と同じ。
1 2 3 |
class MemberList(ListView): def get_queryset(self): return Member.objects.order_by('-age') |
一覧表示画面から詳細画面への遷移は、同じくジェネリックビュー(汎用ビュー)であるDetailViewを利用すると便利です。
参照ページ
django ドキュメント