【Django】3行でできるListViewの基本・書き方

※本サイトにはプロモーション・広告が含まれています。

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

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

「ListViewってどうやるの?」

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

当記事を通じて、

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

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

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

早速見ていきましょう

✔YouTube解説動画

当記事の内容は動画を見ながら進めると、約15分程度で完了します。

動画ならではの情報も解説しているので、記事と一緒にご覧ください。

動画の概要欄には、単元ごとのコードを紹介しているgithubページも載せています。

✔独学におすすめ

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

さいしょに

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

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」変数

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

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

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

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