【Django入門】viewsを使ってページを表示させよう

今回は、PythonのDjangoで使われるviewの書き方、使い方について解説します。

viewだけではなく、MTVモデルについても併せて学んでいきましょう。

この記事では、

・MTVモデルとは何か
・viewとは何か

について解説します。さらに、

・view関数、viewクラスについて
・クラスベース汎用ビューの使い方

についての解説を通して、複雑なviewに対しての知識も深めていきましょう。

目次

MTVモデルとは

今回学ぶviewの前に、まずはMTVモデルと呼ばれる設計思想について学んでいきましょう。

DjangoはMTVモデルを採用しています。

MTVとは、

・Model(データベースに格納されているデータ)
・Template(テンプレートファイルによって定義されたそれぞれのページのデザイン)
・View(どのページを表示させるかを決定する処理)

の頭文字を取ったものです。

図にしてみるとこのようになります。

よく似た設計にMVC(Model、View、Controller)というモデルもあります。

MVCモデルの場合は、

・Model(データベースに格納されているデータ)
・View(ページをどのように見せるのかを決定する処理)
・Controller(ユーザーからの入力をModelに伝える処理)

になります。

MVCモデルを採用しているフレームワークには、Ruby on Railsがあります。

viewとは

これから学んでいくviewは具体的にどのような役割をするのか、見ていきましょう。

viewではどのページを表示するかを決定する処理をしています。

具体的には送られてきたリクエストをもとに、どのページを表示させるかの決定をしています。

関数で実装されているviewや、クラスで実装されているviewもあります。

一緒にviewに触れてみましょう!

view関数の使い方

ここからは実際にview関数を書いて、動作をさせてみます。

Djangoのインストール方法

まずはDjangoをインストールしましょう。

Djangoはパッケージとして提供されています。

インストール方法はこちらの記事をご覧ください。

プロジェクトとアプリケーションの作成

インストールが出来たら、次はプロジェクトアプリケーションを作成していきます。

詳しくはこちらの記事で解説されているのでご覧下さい。

簡単なview関数の作成

プロジェクトとWebアプリケーションのテンプレートまでは出来ましたか?

myappディレクトリに入ると、views.pyというファイルがあります。

これが、MTVモデルのViewを司る今回の肝となる部分です。

views.pyにこのような記述をしましょう。

from django.http import HttpResponse
 
def index(request):
    return HttpResponse("Hello, world.")

indexという関数名で引数にrequestを受け取り、「Hello,World.」というHTTPレスポンスを返します。

HTTPレスポンスとは、ページなどに関するサーバーからの返信と考えて良いでしょう。

しかし、これだけではまだ動きません。

views.pyと、URLを紐付けする必要があります。

urlpatternsを使ってurls.pyに設定を追加

先程はviews.pyにindex関数を追加しました。

しかし、views.pyを編集するだけではアクセスすることができません。

viewを呼ぶために、urls.pyというファイルを作って紐付けをする必要があります。

これは自動で生成されないので、views.pyと同じディレクトリに自分で作りましょう。

そしてこのように編集します。

from django.conf.urls import url
from . import views
 
urlpatterns = [
    url(r'^$', views.index, name='index'),
]

views.pyに追加したindex関数を、urls.pyに紐付けします。

今編集したurls.pyは、myapp/urls.pyでしたが、mySite/urls.pyも編集する必要があります。

このコードをmySite/urls.pyに書きましょう。

from django.conf.urls import include, url
from django.contrib import admin
 
urlpatterns = [
    url(r'^myapp/', include('myapp.urls')),
    url(r'^admin/', admin.site.urls),
]

これで、すべての準備は完了です。

ターミナルでmySiteディレクトリに入り、このコマンドを実行しましょう。

from django.conf.urls import include, url
from django.contrib import admin
 
urlpatterns = [
    url(r'^myapp/', include('myapp.urls')),
    url(r'^admin/', admin.site.urls),
]

これで、すべての準備は完了です。

ターミナルでmySiteディレクトリに入り、このコマンドを実行しましょう。

python manage.py runserver

これで、 http://127.0.0.1:8000/ にブラウザでアクセスするとサーバーが起動していることがわかると思います。

さらに、http://127.0.0.1:8000/myapp にアクセスすると、views.pyのHTTPレスポンスで指定したHello, World.が表示されます。

これですべての紐付けが出来ました。

viewクラスの使い方

viewには関数だけではなくクラスも使うことができます。

リクエストがシンプルなものであれば関数でも構いません。

しかし、関数を使う場合、リクエストによって処理を変える場合はif文を使って多くの分岐を書かなければなりません。

そこで、viewクラスを使うことによってviews.pyに書く量を減らすことができます。

現在は関数のviewよりもクラスのviewが一般的になっているのでぜひ覚えておきましょう。

また、クラスで使われる継承などについてはこちらの記事をご覧ください。

簡単なviewクラスの作成

ここで、viewクラスを使ったviews.pyを書いてみましょう。

from django.views.generic import TemplateView
 
class IndexTemplateView(TemplateView):
    template_name = "index.html"

すでにDjangoに用意されているTemplateViewというクラスから継承して、独自のメソッドを書いています。

メソッドはありませんが、プロパティでtemplate_nameを指定しています。

urls.pyも同時に変更しましょう。

from django.conf.urls import url
from django.contrib import admin
from myapp.views import IndexTemplateView
 
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^myapp/', IndexTemplateView.as_view()),
]

クラスベースのViewを使う時はas_view()メソッドを使うことを覚えておきましょう。

これで、テンプレートとviewクラスを使ってページを表示させることができました。

クラスベース汎用ビューの応用

クラスを利用したviews.pyについてわかったところで、応用について学んでいきましょう!

TemplateViewで変数を使う方法

今まではHttpResponseで返した「Hello,World.」という文字列しか返すことができませんでした。

しかしテンプレート変数を利用することで、データベースに格納されているものを表示することができます。

ここではデータベースには触れず、変数が使えることの確認をしたいと思います。

from django.views.generic import TemplateView
 
class SampleTemplate(TemplateView):
    template_name = "index.html"
 
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["title"] = "MyPage"
        return context

このようにviews.pyを編集をします。

contextという変数には、継承元のメソッドを呼び出しています。

これで、index.htmlというファイルにこのような編集をします。

<html>
<head>
<title>django view test</title>
</head>
<body>
<p>{{title}}</p>
</body>
</html>

これで、titleという変数がindex.htmlに書き加えられました。

これはtemplateファイルとも呼ばれるものです。

詳しくはこちらの記事をご覧ください。

views.pyではtitleという変数にMyPageが入っているので、ページが表示されるとMyPageという文字が表示されます。

まとめ

MTVモデルのひとつを担う大切なViewについて、学習してきました。

views.pyの書き方や、urls.pyがどのような働きをするかについて、覚えておきましょう。

また、Djnagoを扱う上でこれらの内容は基本的な部分になります。

クラスベース汎用ビューは中でも大切な部分になるので、しっかりと身につけておきましょう!

この記事を書いた人

侍エンジニア塾は「人生を変えるプログラミング学習」をコンセンプトに、過去多くのフリーランスエンジニアを輩出したプログラミングスクールです。侍テック編集部では技術系コンテンツを中心に有用な情報を発信していきます。

目次