• class based view

    前の記事では、views.pyファイルの中でhelloworldという関数を作り、hello worldを出力しました。

    次に、関数ではなくクラスを使ってhello worldを出力していきましょう。

    class based viewとfunction based view

    まずはfunction based viewのおさらいです。

    view.pyファイルの中でdef helloworldを定義したと思います。あらためてみてみましょう。

    コード
    

    -BASE/helloworld/views.py

    def helloworld(request):

        return HttpResponse('<h1>hello world</h1>')

    views.pyファイルの中で、def helloworldと関数が定義されている分かります。これがfunction based viewです。

    これに対し、class based viewは関数ではなくクラスを使います。

    class based viewを使って実装してみる。

    実際に、クラスを使った実装をしてみましょう。

    class based viewの基本的な考え方

    実装するまえに、class based viewの基本的な考え方についてみていきましょう。

    Djangoでは、ブラウザへの表示方法をコントロールするためのclassが沢山準備されています。

    これは、何か文章を作る際のひながたのようなイメージです。

    例えば、会社で報告書を書く時、一から書くのは大変ですよね。報告書には、あらかじめ決められた書き方があるはずです。

    クラスも同じようなイメージで、Djangoがあらかじめ準備しているクラスを使うことで、ブラウザへの表示内容を効率的にコントロールすることができるのです。

    では本題に戻りましょう。実装を進めていきます。

    コード
    

    -BASE/helloworld/views.py

    1 from django.views.generic import TemplateView    ← new!

    2 class HelloWorldView(TemplateView)    ← new!

    3     template_name = 'hello.html'    ← new!

    コードの解説
    

    (1) 1行目で、TemplateViewをimportしています。このTemplateViewは、 サイトの見た目を整えるために、djangoがあらかじめ備えているクラスのことです。

    このTemplateViewの中に、メソッド(関数)や属性が沢山入っています。

    (2) クラスの定義です。今回は、HelloWorldViewという名前でclassの定義を行い、そのクラスがTemplateViewを継承することで、TemplateViewがあらかじめ備えているメソッドや属性を使うことができるようにしました。

    継承についてよくイメージがわかない方は、継承について分かりやすく解説という記事を参考にしてください。

    (2) 3行目のtemplate_nameは、TemplateViewクラスが持っている属性です。

    template_nameは、HelloWorldViewクラスが呼びだされた時に呼び出すhtmlファイルを指定するために使われます。

    今回は、'hello.html'というファイルを読み込むように設定しました。

    クラスビューで読み込まれるファイルの場所は?

    さきほど、template_name = 'hello.html'とし、HelloWorldViewクラスが呼び出された時にはhello.htmlファイルをブラウザに表示する。としましたが、このhello.htmlファイルは一体どこに作成すれば良いでしょうか?

    その答えは、「settings.pyファイルの中で設定した場所」です。

    つまり、settings.pyファイルの中で、htmlファイルをどこから呼び出すのかという設定をすることで、その設定したフォルダからhtmlファイルが呼び出されるようになるのです。

    ちなみに、settings.pyファイルは、IPアドレスやデータベースの設定など、djangoの設定に関数内容が書かれたファイルです。

    settings.pyファイルの中身について詳しく理解したい方は、settings.pyファイルの中身を解説【イメージが大切です】という記事を参考にしてみて下さい。

    htmlファイルを読み込ませるフォルダの設定

    ここから、htmlファイルを読み込ませるフォルダの場所の設定をしていきましょう。

    「settings.py」ファイルの下の方にある「TEMPATE」という設定項目を見ていきましょう。

    コード
    

    -BASE/helloworld/settings.py

    TEMPLATES = [

        {

            ...

            'DIRS': []

            ...

        }

    ]

    TEMPLATESの中の「DIRS」という部分に注目しましょう。このDIRSにフォルダの名前を入力することで、djangoでhtmlなどのテンプレートを呼び出すとき、そのフォルダが参照されることになります。

    BASE_DIRをおさえる

    この設定をする時におさえておきたいのが、BASE_DIRです。

    BASE_DIRは変数なのですが、これはsettings.pyファイルの中に書かれています。

    実際に見てみましょう。

    コード
    

    settings.py

    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

    長くて分かりづらいコードなのですが、結論からお伝えすると、BASE_DIRが示しているのは、manage.pyファイルが入っているフォルダです。

    つまり、'DIRS'にBASE_DIRと設定することで、htmlなどのファイルは、manage.pyが入っているフォルダから探されるようになるのです。

    BASE_DIRの仕組みについて詳しく知りたい方は、BASE_DIRを分かりやすく解説という記事を参考にしてください。

    まずはsettings.pyファイルを編集していきましょう。

    コード
    

    settings.py

    TEMPLATES = [

        {

            ...

            'DIRS': [BASE_DIR]    ← new!

            ...

        }

    ]

    DIRにBASE_DIRを追記しました。これで、views.pyファイルで指定したhtmlファイルは、manage.pyが入っているフォルダの場所から探されるようになります。

    次に、hello.htmlファイルを作っていきましょう。

    コマンドライン
    

    -BASE

    $ touch hello.html

    フォルダ構成
    

    -BASE

    helloworld

    db.sqlite3

    manage.py

    hello.html    ← new!

    コード
    

    hello.html

    <h1>hello world</h1>

    hello.htmlファイルを作り、その中にhello worldと書きました。これで、このファイルが読み込まれればhello worldがブラウザに表示されるはずです。

    urls.pyファイルの設定

    ここまでは主にviews.pyファイルまわり(ブラウザへの表示をコントロールする部分)を中心に設定してきました。

    最後に、urls.pyファイルの設定をしていきましょう。

    http://127.0.0.1:8000/hello(またはlocalhost:8000/hello)というurlをリクエストすることにより、HelloWorldViewクラスが呼び出されるように設定をします。

    コード
    

    urls.py

    from django.contrib import admin

    from django.urls import path

    from .views import HelloWorldView    ← new!

    urlpatterns = [

        path('admin/', admin.site.urls),

        path('hello/', HelloWorldView.as_view()),    ← new!

    ]

    コードの解説
    

    まずは、views.pyファイルからhelloWorldViewをimportします。

    その上で、127.0.0.1/helloというurlがリクエストされたらHelloWorldViewクラスを呼び出すような設定をしています。

    HelloWorldViewの後に、.as_view()と書かれていますが、これはクラスを呼び出す時に付けなければいけませんので、覚えておくと良いでしょう。

    as_view()の意味は追って説明していきます。

    これで設定は完了です。

    実際にサーバーを立ち上げて、127.0.0.1:8000/helloにアクセスしてみましょう。

    コマンドライン
    

    $ python manage.py runserver

    helloworldの表示

    無事にhello worldが出力されていることがわかります。

    urlを見ると、localhost:8000/helloと入力されていることも確認しましょう。

    表示は変わりませんが、今回はHelloWorldViewクラスが呼び出され、その中のtemplate_nameにかかれているhello.htmlファイルが呼び出されていますので、djangoの内部では全く別のことが行われています。

    djangoには、function based viewとclass based viewの2種類があることと、それぞれの使い方に対するイメージをわかせましょう。

    class based viewのまとめ

    (1) クラスでブラウザの表示を制御するのがclass based view。

    (2) htmlファイルを読み込む場所を設定することで、任意の場所からhtmlファイルを呼び出すことができる。

    class based viewを学んだ後は

    アプリを作って、hello worldを表示させていきます。

    アプリを作るという記事に進みましょう。

    ~Django無料講義~のご案内

    Code for Djangoが、4時間超の無料Django講義をはじめました

    •  ・本を出版したCode for Djangoの
       製作者が作ったサイトです。
    •  ・Code for Djangoの内容も、
       動画で詳しく解説しています。
    •  ・動画は順次ふやしていきますので、
       ただで学び続けることが可能です。
    •  ・Djangoの効率的なスキルアップに、
       是非お役立て下さい。