(最終更新月:2021年11月)
「Djangoクラスを使ってリストビューが作りたい!」
「ListViewってどうやるの?」
というDjango初学者向けの記事となります
当記事を通じて、
- クラスベースビュー「ListView」の最低限これだけは覚えたい記述方法
- viewクラスとURLを紐づけブラウザからアクセスする方法
- ListViewでよく使われるメソッド
について、実例のコードと共にご紹介していきます
ListViewの目的は、データベースから取得したデータ群をリスト化してHTMLテンプレートへ渡すことです
早速見ていきましょう
✔YouTube解説動画
当記事の内容は動画を見ながら進めると、約15分程度で完了します。
動画ならではの情報も解説しているので、記事と一緒にご覧ください。
動画の概要欄には、単元ごとのコードを紹介しているgithubページも載せています。
さいしょに
この関数と全く同じものをクラスで作っていきます
def nippoListView(request):
template_name = "nippo/nippo-list.html"
ctx = {}
qs = NippoModel.objects.all()
ctx["object_list"] = qs
return render(request, template_name, ctx)
ListViewの書き方
ListViewには様々な変数やメソッドが用意されています
ただ、最低限の役割であるデータベースからデータを取得し、リスト化したデータをHTMLテンプレートへ渡すは、下記の3つを抑えればあとは全て自動で行ってくれます
- 使用するクラスのインポート
- 継承クラスの作成
- 変数「template_name」「model」へ値を格納
実際のコード例はこちらです
from django.views.generic import ListView #インポート
class NippoListView(ListView): #クラス作成
template_name = "nippo/nippo-list.html" #変数
model = NippoModel #変数
2つの変数には下記の通り、値を格納しよう!
- 変数「template_name」には使用するHTMLテンプレートのパス
- 変数「model」にはデータを取得する元のモデルクラス名
以上の3つをおこなうと、自動的に
- modelで指定したデータベーステーブルからQuerySetを取得する
- 「object_list」という変数にQuerySetを格納する
- HTMLテンプレートへコンテキストとしてQuerySetを渡す
ことを行ってくれます
作成したviewクラスが作成できましたら、URLと紐づけブラウザからアクセスできるよう設定していきましょう
viewクラスとURLを紐づける
urlpatterns内では、
path(“URLを指定”, ビュークラス.as_view(), name=”ページ名”)
となります
【urls.py】
from .views import ..., NippoListView
urlpatterns = [
...,
path("", NippoListView.as_view(), name="nippo-list"),
...,
]
path内では、ビュークラスをメソッド「as_view()」としている箇所を忘れないようにしましょう!
以上で表示は完了です
ただ、以下の時はどうするのでしょうか?
- リストを動的に変更したい(アクセスするユーザーによって表示するリストを変えたい場合など)
- QuerySet以外にもコンテキストとしてHTMLテンプレートへ値を渡したい
ListViewでは、こんな時のためのメソッドも用意されています
今後使う場面が必ず出てきますので、一つずつご紹介します
クエリセットをコンテキストで渡す「get_querysetメソッド」
get_querysetメソッドでは、
返された値が「object_list」としてHTMLテンプレートへ渡されます
コード例
メソッドを使わない場合
class NippoListView(ListView):
template_name = "nippo/nippo-list.html"
model = NippoModel
メソッドを使う場合
class NippoListView(ListView):
template_name = "nippo/nippo-list.html"
def get_queryset(self):
return NippoModel.objects.all()
どちらも同じリストが表示されます
メソッドを使うメリット
メソッド内で返す値を変更することができます
例えば、
def get_queryset(self):
qs = NippoModel.objects.none()
if self.request.user.is_authenticated:
qs = NippoModel.objects.all()
return qs
ユーザーが”is_authenticated”、つまりログインしていない場合はQuerySetが”None”、ログイン済の場合は”objects.all()”ようにしています
メソッドを使うことで色々と操作が可能になります。
以下の記事で日報アプリ開発で活用した具体例もご紹介しています。
任意の値をコンテキストで渡す「get_context_dataメソッド」
get_context_dataメソッドでは、
返された値がコンテキストとしてHTMLテンプレートへ渡されます
コード例
使用する機会があるかないかは置いといて、「site_name」という変数に「itc.tokyo」というコンテキストを渡してみます
def get_context_data(self):
ctx = super().get_context_data()
ctx["site_name"] = "itc.tokyo"
return ctx
ポイント
ListViewでは、自動的に「object_list」などのコンテキストが用意されていますので、スーパークラスからコンテキストを引き継ぐことを忘れないようにしましょう!
ctx = super().get_context_data()
引き継いだうえで、好きな値をコンテキストで渡していきます
まとめ
コードが複雑になればなるほど、クラスベースビューを使うメリットが出てきます
まずはListViewの使い方として、
- 「template_name」変数
- 「model」変数
を指定するということを頭に入れて置きましょう
メソッドについてはこちらのソースコードを参考にしてみてください!
次回は、クラスベースビュー「ディテールビュー」をご紹介します