[Django] view関数の書き方

Djangoのビューには現在、関数ベースとクラスベースの2種類の書き方があります。
Djangoはクラスベースのビューを推奨しているようですが、クラスベースのビューは慣れるまでは読みづらいのでそれまでは関数ベースでもよいと思います。
このメモでは関数ベースのビューを紹介します。補足的にクラスベースのビューも紹介しますが詳しくはやりません。

シリーズ一覧

  1. プロジェクトの作成とアプリケーションの作成
  2. view関数の書き方 <-今回
  3. URLの指定の仕方(URLディスパッチャ)
  4. データベース(モデル)の設定
  5. 記事の投稿ページの作成
  6. 記事の一覧ページと詳細ページの追加
  7. 記事の編集ページと記事の削除機能の追加
  8. いいね機能の追加
  9. コメント機能の追加
  10. Bootstrapを利用したwebデザイン

はじめに

この話題は前回([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に紐づけてアクセスできるようにしてみましょう。

[Django] URLの指定の仕方(URLディスパッチャ)