こんにちはえびかずきです。
今回はDjangoのビューコード『view.py』の基本的な書き方について説明します。
最近DjangoでWebアプリ開発を始めたので、
初学者として自分のためにも備忘録的に記事を残していければと思います。
この記事がDjangoを始めてみたけどつまづいて前に進めない、
というような方の手助けになれば嬉しいです。
開発環境
OS:MacOS Catalina 10.15
Python:3.7.3
Django:2.2.2
ビューの役割
ビューの役割は下図のとおり。
ユーザーからのhttpリクエストを受けて、それに応じたhtml形式のレスポンスを返すことがビューの仕事です。
レスポンスは必要に応じてフォーム、モデル、テンプレートといったアプリケーションコンポーネントとやりとりをして生成します。
つまりビューは、Djangoプロジェクト中で司令塔的な仕事をしています。
このビューとしての役割を担うのが、[views.py]ファイルです。
Djangoプロジェクトのディレクトリ構造の中で、下図のようにアプリケーションフォルダ内に配置されます。
ビューコードの種類
ビューのコーディング方法には大きく分けて、以下の2種類があります。
関数ベースビュー:
リクエストを引数として、戻り値としてhtmlレスポンスを返す。
(これがビューの本質的な構造)
クラスベースビュー:
Djangoフレームワークが用意しているビュー関連の親クラスを継承して、ビュークラスを作成してそれを使う。
(基本的な機能は親クラスでコーディングしてくれているので、こちらを使ってビューを作るのが一般的)
概念的な説明では分かりづらいと思いますので、ここからビューのコード例を見ながら書き方を説明していきます。
関数ベースビュー例
関数ベースビューの本質的な構造は以下のとおりです。
#関数ベースビュー
def ビュー関数名(リクエスト):
[内部処理]
return HTMLレスポンス
実際の関数ベースビューの例は以下になります。
ビュー2の部分で『view2』という関数を定義しています。
中身はcontextという辞書変数に『user_data』というキーでデータベース情報を格納し、
それを『home.html』というテンプレートに渡してhtmlレスポンスを生成しています。
#views.py(関数ベース)
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
from .models import User_data
///////////////////
#ビュー1のコード
//////////////////
#ビュー2のコード例
# ログイン認証を入れるデコレータ
@login_required
def View2(request):
context = {
'user_data': User_data.objects.filter(user=request.user),
}
return render(request,'home.html',context)
///////////////////
#ビュー3のコード
//////////////////
・
・
・
※『@~』というのは、デコレータの構文です。
デコレータは関数を修飾する働きをもちます。
@を使うこの書き方は糖衣構文(コードを簡略化した構文)とも呼ばれていて、プログラムとしての構造がわかりにくくなっていますが、ここではコーディングしたビュー関数にログイン認証機能を簡単に付与する目的で使われています。
参考:https://techacademy.jp/magazine/33806
クラスベースビュー例
続いて、クラスベースビューです。
本質的な構造は以下のとおりで、Djangoフレームワークの親クラスを継承して作成します。
#クラスベースビュー
class ビュークラス名(親クラス):
[内部処理]
実際のコード例は以下です。
内容は関数ベースの時のものと一緒ですが、クラスベースだとコーディングの仕方が変わります。
ここではListViewという親クラスを継承して、クラスベースビューを作成しています。
詳細は、コード中に書き込みましたので、そちらをご覧ください。
#views.py (クラスベース)
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views import generic
from .models import User_data
# LoginRequiredMixin(ログイン認証用)とListViewという親クラスを継承している。
class HomeView(LoginRequiredMixin, generic.ListView):
model = User_data
template_name = "home.html"
get_querysetメソッドをオーバーライドして、データの一部だけを取得している。
def get_queryset(self):
return User_data.objects.filter(user=self.request.user)
継承:
ベースとなるクラス(親クラス)を引き継いで新しいクラス(子クラス)を作ること。『class 子クラス(親クラス):』という風にコーディングする。
オーバーライド:
子クラス内で親クラスの変数やメソッドを上書きすること。
よく使う親クラス
親クラス | 用途 |
RedirectView | リダイレクトをベースとするクラス |
TemplateView | テンプレート表示をベースとするクラス |
ListView | モデルオブジェクトのリストを表示するクラス |
CreateView | モデルオブジェクトを作成するクラス |
DetailView | モデルオブジェクトの詳細を表示するクラス |
UpdateView | モデルオブジェクトを更新するクラス |
DeleteView | モデルオブジェクトを削除するクラス |
FormView | フォームを処理するクラス |
まとめ
今回はviews.pyの書き方について、基礎的な部分を解説しました。
今回の内容は、Webアプリ開発を行う上で基礎の基礎になる重要な知識です。
もし最初の方でつまずいてしまった方の理解の助けになれば幸いです。
参考書籍
この記事は下の書籍を参考にさせていただきました。
コメントを書く