[Django] view関数の書き方
Djangoのビューには現在、関数ベースとクラスベースの2種類の書き方があります。
Djangoはクラスベースのビューを推奨しているようですが、クラスベースのビューは慣れるまでは読みづらいのでそれまでは関数ベースでもよいと思います。
このメモでは関数ベースのビューを紹介します。補足的にクラスベースのビューも紹介しますが詳しくはやりません。
シリーズ一覧
はじめに
この話題は前回([Django] プロジェクトの作成とアプリケーションの作成)の続きです。
myblog
という名前のプロジェクトblog
という名前のアプリを作成しいている呈で話を進めます。
現在のプロジェクトの構成は以下のようになっているとします。
./myblog
├── blog
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── manage.py
└── blog
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
ビューってなぁに?
Djangoでいうビュー(view)はページがリクエストされたときにサーバー内でどのような処理をするかを記述したものです。
データベースの操作やどのような要素をページに含めるか、などの記述はここで行います。
ビューってどこに書くの?
Djangoのビューは各アプリケーションのviews.py
のファイルに書き込みます。
今回のケースだとmyblog/blog/views.py
です。
下準備(テンプレートファイル)
ビュー関数が呼び出されたときに、実際に表示させるHTMLファイルを事前に用意しておこうと思います。
このHTMLファイルはDjangoではテンプレートと呼ばれます。
myblog/blog/
の下にtemplates
というディレクトリを作成します。
さらにそのtemplates
中にアプリケーション名
のディレクトリを作ります。今回の場合はblog
になります。
さらにその中にindex.html
を作ります。
作成後はこんな感じのファイル構成になっていれば大丈夫です。
./myblog
├── blog
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── templates # 新しく追加したディレクトリ
│ │ └── blog # 新しく追加したアプリケーション名のディレクトリ
│ │ └── index.html # 新しく追加したファイル
│ ├── tests.py
│ └── views.py
├── manage.py
└── project
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
index.html
の中身は以下のようにしておきましょう。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>my-blog-index</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<p>まい ぶろぐ とっぷぺーじ</p>
</body>
</html>
関数ベースのビュー
関数ベースのビューの場合views.py
には以下のように記述します。
from django.shortcuts import render
def index(request):
template_name = "blog/index.html" # templates以下のパスを書く(アプリケーション名[blog] / ファイル名[index.html])
return render(request,template_name)
index
というのがビュー関数です。
関数の名前は何でもよいのですが表示させるHTMLファイルと合わせておくとわかり易いのでそうしましょう。
ビュー関数(index)の第一引数(request)にはhttpのアクセス情報がいろいろ入っています。
render関数の第一引数にはビュー関数で受け取った第一引数をそのまま渡します。
第二引数には表示させたいHTMLファイルへのパスを記述します。
index
関数の中ではただ単にHTMLを表示させるだけの記述を行っています。return render(request,template_name)
のところがそれに該当します。
クラスベースのビュー
from django.views.generic import TemplateView
class index(TemplateView):
template_name = "blog/index.html" # templates以下のパスを書く
TemplateViewを継承したクラスを定義してクラス変数template_nameに表示させたいHTMLファイルへのパスを記述します。
こちらも、関数ベースのビューと同じようにシンプルにHTMLを表示するだけです。
まとめ
ビュー関数はhttpアクセスの情報が入った引数を一つ受け取る。
戻り値は
render(受け取った第一引数,表示させたいhtmlファイルへのパス)
最後に
今回は、ビュー関数の超基本的な書き方を紹介しました。
次回は今回作成したビューを実際にURLに紐づけてアクセスできるようにしてみましょう。