こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!
クラスベースビュー(Class Based Views)とは?
クラスベースビューは関数で記述したView(Function Based Views)とは異なり、Classで記述する方法を指します。クラスベース汎用ビュー(Class Based Generic Views)とも呼ばれます。
クラスベースビューはDjangoに用意されたdjango.generic.viewからViewクラスを継承またはミックスインして作成するのが特徴的です。Viewクラスはアプリケーション用途に応じた豊富なメソッドを揃えており、これを使いこなせると関数形式で記述していたViewよりもさらにシンプルかつ分かりやすいコードで表現できるようになります。
コード量の低減(Less Code)および冗長・重複したコードを記述しない(Don’t Repeat Yourself)がDjangoの設計思考であるため、クラスベースビューの利用が推奨されている側面もあります。
本記事では、下記の内容を順番にご紹介していきます。
- 代表的なViewクラスの概要説明
- View関数とViewクラスのコーディング比較
- 代表的なクラスベースビューを用いてWebアプリを実装する方法
代表的なViewクラスと役割一覧
Djangoには多様な用途のアプリケーションに対応したViewクラスが用意されています。以下特に利用頻度の高いものを示します。
ビュークラス名 | 概要 | 利用画面例 |
---|---|---|
View | get()、post()などHTTPメソッドに特化したビュー | 画面全般 |
TemplateView | テンプレートファイルを読み込み、ページ生成するための便利機能が揃った最も代表的なビュー | 画面全般 |
ListView | データベースと連携し、複数レコードの特定情報を一覧表示する際に利用 | 一覧画面 |
DetailView | データベースと連携し、単一レコードの詳細情報を表示する際に利用 | 詳細画面 |
CreateView | データベースと連携し、レコード生成する際に利用 | 新規登録・追加画面 |
UpdateView | データベースと連携し、レコードの中身を編集する際に利用 | 編集画面 |
DeleteView | データベースと連携し、レコード削除する際に利用 | 削除画面 |
FormView | フォームを実装する際に利用 | 問い合わせ |
LoginView | ログイン機能実装時に利用 | ログイン |
APIView | 外部APIを用いたロジック構築時に利用。実装時はDjango Rest frameworkの知識が必要 | – |
ViewクラスとView関数の違い・コード比較
それでは実際にコードを見ながらクラスベースビューの特徴を理解していきましょう。
基本的なViewクラスとView関数のコードを比較に際して、上記テンプレートファイル(Index.html)に処理を反映した場合を示します。以下Views.pyおよびurls.pyの記述の違いを見てみましょう。
Views.py比較
GetおよびPost処理を記述したい場合、Viewクラスを用いるとそれぞれを関数で分けて表現できるため、直感的に分かりやすく記述できます。
views関数の場合
from django.shortcuts import render
def index(request):
if request.method == "GET":
params = {"message":"View関数:Get処理"}
return render(request,"Index.html",params)
if request.method == "POST":
params = {"message":"View関数:Post処理"}
return render(request,"Index.html",params)
viewsクラスの場合
from django.views.generic import View
from django.shortcuts import render
class CBView(View):
def get(self,request):
params = {"message":"クラスベースView:Get処理"}
return render(request,"Index.html",params)
def post(self,request):
params = {"message":"クラスベースView:Post処理"}
return render(request,"Index.html",params)
urls.py比較
Viewクラスを用いる際は、クラス名の後にas_view()と記載します。
from django.urls import path
from .(views.pyディレクトリ名) import views
urlpatterns = [
# View関数をURLマッピング
path("FBV", views.index),
# ViewクラスのURLマッピング
path("CBV", views.CBView.as_view()),
]
テンプレート(HTML)比較
ViewクラスおよびView関数において、用いるテンプレートは同じものを利用できます。特にViewクラスを利用するからといってテンプレート側で特殊な処理を施す必要はありません。
テンプレートのサンプルとして下記を掲載します。前述のViewクラスコードの動作確認等でお使い下さい。
<!DOCTYPE html>
<html lang="ja" dir="ltr">
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h1>View関数とViewクラスの比較</h1>
<h2>{{ message }}</h2>
</body>
</html>
代表的なクラスベースベースビューを用いてWebアプリを実装
ここからは個々のViewクラスを用いてWebアプリを作成します。以下の記事では実装手順から各Viewクラスの基本操作を詳しく解説していますため是非ご覧ください!
TemplateView
TemplateViewは最もよく用いられるViewクラスであり、簡単にテンプレートファイルと連携できるのが特徴です。TemplateViewの詳細や実装方法は下記の記事にまとめていますので是非ご覧ください。
【Django】TemplateView(テンプレートビュー)の基本操作入門|PythonによるWebアプリ開発#13
Djangoのクラスベースビューにおいて代表的な「TemplateView」の紹介記事です。「そもそもTemplateViewとは何か?」「TemplateViewでどのようにプログラミングするのか?」 本記事ではこのような疑問にお応えします。
ListView
データベースと連携し、複数レコードの特定情報を一覧表示する際に用いるListViewの基本操作解説記事です。主に一覧画面を実装する際に広く利用されています。
【Django】ListView(リストビュー)の基本操作入門|PythonによるWebアプリ開発#14
データベース連携の際に便利なDjangoのクラスベースビューの1つ「ListView」の紹介記事です。「ListViewとは何か?」「ListViewで何ができるのか?」「どのようにプログラミングするのか?」 本記事ではこのような疑問にお応えします。
DetailView
データベースと連携し、単一レコードの詳細情報を表示する際に用いるDetailViewの基本操作解説記事です。上記ListViewとセットで用いられることが多く、詳細画面を実装する際に広く利用されています。
【Django】DetailViewの基本操作入門|PythonによるWebアプリ開発#15
データベース連携の際に便利なDjangoのクラスベースビューの1つ「DetailView」の紹介記事です。「DetailViewとは何か?」「DetailViewで何ができる?」「どのようにコーディングする?」 本記事ではこのような疑問にお応えします。
CreateView,UpdateView,DeleteView
データベースと連携し、CRUD機能を実装する際に用いるCreateView, UpdateView, DeleteViewの基本操作解説記事です。
【Django】ViewクラスでCRUD(Create・Update・Delete)実装|PythonでWebアプリ開発#16
Djangoフレームワークの解説記事であり、「データベースと連携してCRUD操作を行う方法」に焦点を当てて解説。基礎的なCRUD操作や、CRUD操作実現のクラスベースビュー(CreateView, UpdateView, DeleteView, ListView, DetailView)の利用方法に至るまで把握可能。
【参考】Djangoの解説記事一覧
最後までご覧いただきありがとうございました。当サイトではDjangoフレームワークを用いた解説記事を多数取り扱っております。次のように体系的に整理しておりますため学習にお役立て下さい。
Django学習に最適!
当サイトが運営するDjango記事一覧
【参考】Pythonでできること・お仕事探し
最後に
お問い合わせフォーム
上記課題に向けてご気軽にご相談下さい。
お問い合わせはこちら