学習目標
これまでの学習では、Viewを作成する際に関数を利用する関数ベースビュー(Function Based View)を使用してきました。関数ベースビューでは、データの取得やフォーム処理、POSTデータの受け取り、保存処理などを自分で記述します。
一方、Djangoにはもう一つのView作成方法としてクラスベースビュー(Class Based View)があります。クラスベースビューでは、Djangoが用意している便利なクラスを利用することで、よく使われる処理を少ないコードで実装できます。
この章では、一覧表示に利用するListView、登録処理のCreateView、編集処理のUpdateView、削除処理のDeleteViewについて学習し、関数ベースビューとの違いや使い分けを理解します。
クラスベースビュー
**クラスベースビュー(Class Based View)**とは、Pythonのクラスを利用して作成するViewのことです。これまで使用してきた関数ベースビューでは、def todo_list(request):のように関数を作成して処理を記述していました。
一方、クラスベースビューでは、class TodoListView(View):のようにクラスとしてViewを定義します。Djangoでは、一覧表示やデータ登録、編集、削除など、Webアプリケーションでよく利用される処理をあらかじめクラスとして用意しています。そのため、複雑な処理を一から記述する必要がなく、少ないコードで基本的な機能を実装できます。
関数ベースビューとの違い
関数ベースビューでは、View内の処理をすべて自分で記述する必要があります。例えば一覧表示では、データベースからデータを取得し、Templateへ渡し、HTMLを表示するといった流れを順番に作成します。
一方、クラスベースビューでは、Djangoが用意しているクラスを利用することで、よく使われる処理を自動化できます。例えば一覧表示では、class TodoListView(ListView):のようにListViewを継承し、model = TodoとModelを指定するだけで、データ取得やTemplateへの受け渡しなど、一覧表示に必要な処理を自動的に実行してくれます。
ListView
ListViewは、データの一覧表示を行うためのクラスベースビューです。これまで作成してきたTodo一覧画面のような、複数のデータを表示する画面で利用できます。関数ベースビューでは、データベースからTodoを取得し、Templateへ渡して表示する処理を自分で記述する必要がありました。一方、ListViewでは、class TodoListView(ListView):のようにListViewを継承し、model = TodoとModelを指定するだけで、一覧表示に必要な基本的な処理を自動で実行できます。ListViewは、Todo一覧だけでなく、商品一覧、ブログ記事一覧、ユーザー一覧など、多くのWebアプリケーションの一覧画面で利用されています。
CreateView
CreateViewは、新しいデータを登録するときに利用するクラスベースビューです。これまでのTodo登録処理では、フォームの表示、POSTデータの取得、データベースへの保存などを自分で記述していました。
しかし、CreateViewを利用すると、ModelやFormを指定するだけで登録処理を自動化できます。例えば、class TodoCreateView(CreateView):のように作成し、対象となるModelを指定します。
CreateViewでは、入力フォームの表示、POSTデータの受け取り、データの保存といった登録に必要な処理をDjangoが自動的に実行してくれるため、少ないコードで新規登録機能を実装できます。
UpdateView
UpdateViewは、既存のデータを編集・更新するときに利用するクラスベースビューです。これまでのTodo編集処理では、編集対象のTodoを取得し、フォームへ表示し、POSTされた内容を受け取り、save()でデータを保存する処理を自分で作成していました。
UpdateViewを利用すると、これらの処理を簡単に実装できます。例えば、class TodoUpdateView(UpdateView):のように作成し、model = Todoと編集対象のModelを指定します。
UpdateViewでは、編集するデータの取得、フォームへの表示、変更内容の更新処理をDjangoが自動的に実行してくれるため、少ないコードで編集機能を作成できます。
DeleteView
DeleteViewは、既存のデータを削除するときに利用するクラスベースビューです。これまでのTodo削除処理では、削除対象のデータを取得し、確認画面を表示した後、delete()を実行して別ページへ移動する処理を自分で作成していました。
DeleteViewを利用すると、これらの削除処理を簡単に実装できます。例えば、class TodoDeleteView(DeleteView):のように作成し、model = Todoと削除対象のModelを指定します。
DeleteViewでは、削除対象データの取得、削除処理、削除後のリダイレクトなどをDjangoが自動的に実行してくれるため、少ないコードで削除機能を作成できます。
クラスベースビューを利用するメリット
クラスベースビューには、次のようなメリットがあります。
コード量を減らせる
クラスベースビューでは、Djangoがあらかじめ用意しているクラスを利用できます。例えば、ListViewを利用すると、データの取得やTemplateへの受け渡しなど、一覧表示に必要な処理を自動で実行してくれます。そのため、関数ベースビューで必要だった多くの処理を記述する必要がなくなり、コード量を減らすことができます。
開発速度が向上する
一覧表示、登録、編集、削除など、Webアプリケーションでよく利用される機能は、Djangoに専用のクラスが用意されています。必要な設定を行うだけで基本的な機能を実装できるため、開発時間を短縮できます。特にCRUD機能のような一般的な処理では、大きな効果があります。
拡張しやすい
クラスベースビューは、クラスの仕組みを利用して処理を追加・変更できます。例えば、ログイン制限を追加したり、データ取得条件を変更したりする場合でも、既存のクラスを継承して必要な部分だけ変更できます。そのため、アプリケーションの規模が大きくなっても、管理しやすいコードを作成できます。
関数ベースビューとクラスベースビューの使い分け
どちらが優れているというわけではありません。
それぞれ特徴があります。
| 関数ベースビュー | クラスベースビュー | |
|---|---|---|
| 書き方 | 関数 | クラス |
| 分かりやすさ | 処理の流れを理解しやすい | 慣れるまで少し難しい |
| コード量 | 多くなりやすい | 少なくできる |
| 拡張性 | シンプル | 高い |
| 初学者向き | ◎ | ○ |
学習初期では関数ベースビューのほうが処理の流れを理解しやすく、実際の開発ではクラスベースビューがよく利用されます。
CRUDとクラスベースビューの対応
これまで作成したTodoアプリの機能は、次のように対応します。
| 機能 | クラスベースビュー |
|---|---|
| 一覧表示(Read) | ListView |
| 登録(Create) | CreateView |
| 編集(Update) | UpdateView |
| 削除(Delete) | DeleteView |
Djangoでは、このようにCRUD処理に対応した便利なクラスが標準で用意されています。
まとめ
この章では、**クラスベースビュー(Class Based View)**について学習しました。クラスベースビューとは、Pythonのクラスを利用して作成するViewのことです。
これまで利用してきた関数ベースビューでは、データ取得や保存処理などを自分で記述する必要がありました。一方、クラスベースビューでは、Djangoが用意している標準クラスを利用することで、よく使われる処理を少ないコードで実装できます。
ListViewは一覧表示、CreateViewはデータ登録、UpdateViewはデータ編集、DeleteViewはデータ削除に利用します。クラスベースビューを活用することで、効率よくWebアプリケーションを開発できるようになります。
ここまでで、Djangoでよく利用されるCRUD処理を、より効率的に実装する方法になります。