【Django初学者向け】超カンタン!3行でリストビューが完成!?クラスベースビュー「ListView」の基本を解説します

ListView BasicsDjango

(最終更新月:2021年11月)

「Djangoクラスを使ってリストビューが作りたい!」

「ListViewってどうやるの?」

というDjango初学者向けの記事となります

当記事を通じて、

  • クラスベースビュー「ListView」の最低限これだけは覚えたい記述方法
  • viewクラスとURLを紐づけブラウザからアクセスする方法
  • ListViewでよく使われるメソッド

について、実例のコードと共にご紹介していきます

ListViewの目的は、データベースから取得したデータ群をリスト化してHTMLテンプレートへ渡すことです

早速見ていきましょう

さいしょに

この関数と全く同じものをクラスで作っていきます

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つを抑えればあとは全て自動で行ってくれます

  1. 使用するクラスのインポート
  2. 継承クラスの作成
  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つを行うと、自動的に

  1. modelで指定したデータベーステーブルからQuerySetを取得する
  2. object_list」という変数にQuerySetを格納する
  3. 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」変数

を指定するということを頭に入れて置きましょう

メソッドについてはこちらのソースコードを参考にしてみてください!

次回は、クラスベースビュー「ディテールビュー」をご紹介します

当ブログでは、日報アプリ開発を通じて、Webアプリを一から開発し公開するまでを初学者の方でもわかるようにと記事を連載しています

「Djangoでのアプリ開発を学びたい!」
「Djangoで開発したアプリをWebで公開するにはどうするの?」

という方は必見です!

【Django】チュートリアル|日報アプリの開発から公開まで
Djangoのチュートリアルをお探しですか?具体的に「手を動かして作ってみたい!」という方へ向けて、誰でもできる簡易的な日報アプリの開発を通じて、Djangoの様々な機能に触れていくシリーズとなっています。PythonでWebアプリを作りたい方、必見の記事となります!

公式LINEも始めました。ブログの更新や最新の業界情報などを随時配信します!

友だち追加

タイトルとURLをコピーしました