【完全版】Django クラスベースビューを実例付で徹底解説!

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

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

「クラスベースビューってなに??」

「ファンクションビューとなにが違うの?」

「クラスベースビューの書き方は?」

といったDjango初学者の方へ向けた、

クラスベースビューの基本

について解説をした記事となります

ファンクションビューの良いところは自由に、直感的にコードが書けるところです

対して、クラスベースビューは既存のメソッドを覚える必要があるのでとっつきにくいのも事実です

ただ、Webアプリには構造上共通した項目やページも多いので、クラスベースビューを使うとPythonクラスの特徴である「継承」を使い、より洗練されたコードが描けるようになります

是非ここでクラスベースビューの概要をマスターして、クラスベースビューとファンクションビューを上手に使い分け、アプリ制作に励みましょう!

筆者プロフィール

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

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

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

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

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

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

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

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

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

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

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

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

クラスベースビューとは?

クラスベースビューを使うことで、既存のクラスを継承し、よりスッキリとしたDRY(Don’t Repeat Yourself)な記述ができるようになります

例えばファンクションビューでは、

return render(request, テンプレート名)

とすることでHTMLテンプレートをレンダーしますが、

クラスビューでは、

template_name = テンプレート名

値を代入するだけで自動的に表示されます

別の例としては、ファンクションビューでQuerySetを取得してHTMLテンプレートに渡すには、

qs = モデル名.objects.all()
context = {"object_list": qs}
return render(request, テンプレート名, context)

などと記述する必要があるのに対して、クラスベースビューでは、

template_name = テンプレート名
model = モデル名

とするだけで、QuerySetがテンプレートへ渡されます

これも既存クラスを継承したことで成せる技です

次章で「クラスビューの書き方」を解説しますので、まずは触れてみて良さを感じてください!

クラスベースビューはこれで書ける!

下記のステップをふめば簡単にクラスベースビューが完成します

  1. 既存のクラスをインポート
  2. 継承クラスを作成
  3. 最低限必要な変数を定義
  4. urls.pyでアドレスに紐付ける

1 – 3はそれぞれのクラスにより異なりますので、次章以降で個別にご説明します

ここでは4のurls.pyの書き方について解説します

[urls.pyでの書き方]※作成したクラスビュー名を「CustomView」とします

from django.urls import path
from .views import CustomView #作成したクラスベースビュー名

urlpatterns = [
    ...,
    path("custom-view/", CustomView.as_view()),
    ...,
]
urls.pyの記述で覚えておきたいこと
  • views.pyより、作成したビュークラスのインポートすること
  • ビュークラス名に続いて、as_view()メソッドを入れて記述すること

特に2つ目の「.as_view()」はファンクションビューでは出てこないので、覚えておくようにしましょう!

path(“アドレス/”, クラス名.as_view())

それでは、基本的な「ビュークラス」を見ていきましょう!

TemplateView

HTMLテンプレートを表示する

というシンプルな役割を担っています

指定する変数

template_name

「template_name」に代入されたテンプレートがレンダーされます

コード例

from django.views.generic import TemplateView

class CustomTemplateView(TemplateView):
    template_name = "itc/my-template.html"

よく使うメソッド

get_context_data

HTMLテンプレートへ値を渡します

FormView

変数「form_class」に指定されたフォームクラスを表示します

指定する変数

template_name
form_class

「template_name」に代入されたテンプレートがレンダーされます

「form_class」に代入したフォームクラスがContextとしてテンプレートへ渡されます

コード例

[forms.py]

from django import forms

class CustomForm(forms.Form):
    title = forms.CharField(max_length=50)
    content = forms.CharField(max_length=255)

[views.py]

from django.views.generic import FormView
from .forms import CustomForm

class CustomFormView(FormView):
    template_name = "itc/custom-form.html"
    form_class = CustomForm

よく使うメソッド

get_form_kwargs

form_classへ任意の値を渡せます

get_context_data

HTMLテンプレートへ値を渡します

form_valid

フォームが正しく送信された時に処理が行われます

CRUDに関するクラスベースビュー

その他にも、

  • ListView
  • DetailView
  • CreateView
  • UpdateView
  • DeleteView

など、より目的がはっきりとしたCRUDに関するクラスベースビューも用意されています

CRUDに関するクラスベースビューについてはこちらでそれぞれご紹介していますので興味のある方はご覧ください↓

まとめ

クラスベースビューは記述する前に覚えておく事があるため、まっさらな状態で始めても上手くいきません

当記事を通じて伝えたいことは、

  • クラスベースビューでは定義すべき変数を覚える事
  • クラスベースビューでは上書きできるメソッドを覚える事
  • urls.pyでは、クラス名.as_view()で表記する事

です

「クラスベースビューって思ったより使えるじゃん!」と思われた方がいらっしゃれば幸いです

また、よく使うメソッドとしていくつかご紹介致しましたが、詳しくはこちら↓で解説をしております

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