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

ListView BasicsDjango

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

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

「ListViewってどうやるの?」

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

当記事を通じて、

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

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

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

早速見ていきましょう

【著者プロフィール】

profile_icon
【Python歴】11年 x 【Django歴】10年
HP作成、社内システムの構築、コンサルティング

当ブログを通じて、Webアプリの書き方やアプリの公開方法までを解説しています。

☆日報アプリ「D-Repo」(デモ版)→こちら

※Djangoをベースに作成したアプリです。

☆便利ツールアプリ「Tool Station」→こちら

※Django REST frameworkとReactで作成しているアプリです。

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

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

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

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

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

✔当ブログは以下のような方に向けて書かれています

「Djangoでのアプリ開発を学びたい!」

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

✔当ブログ掲載の記事

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

ITCブログにご協力いただける方は、以下もご検討いただけると嬉しいです。

ITCへ投げ銭をする

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