【Django】TemplateView(テンプレートビュー)の基本操作入門|PythonによるWebアプリ開発#13

こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!

Djangoのクラスベースビューにおいて代表的な「TemplateView」の紹介記事です。「そもそもTemplateViewとは何か?」「TemplateViewでどのようにプログラミングするのか?」
本記事ではこのような疑問にお応えします。

目次

TemplateView(テンプレートビュー)とは?

TemplateViewはクラスベースビューの中でも最もよく用いられるViewクラスであり、簡単にテンプレートファイルやモデルと連携できるメリットがあります。View関数と比較して少ないコードで多様な機能を実装できるのが特徴です。

クラスベースビューの基本概念は下記記事で紹介しています。適時ご参照ください。

それでは下記より実際にTempalteViewを用いたWebアプリを作成しながらTemplateViewの基本操作に慣れていきましょう!

事前準備

ディレクトリ構成

上記のディレクトリ構成をもとに進めて参ります。下記以降で主に取り扱うファイルは以下になります。

  • views.py(アプリケーションフォルダ)
  • urls.py(プロジェクトフォルダ)
  • Index.html(テンプレート)

ここでテンプレートファイルは、settings.pyのディレクトリ設定に基づき、views.pyから直接ファイル指定できる前提とします。テンプレートファイルのディレクトリ設定は下記の記事で紹介していますため、適時ご参照ください。

【実践】テンプレートファイルを表示する

TemplateViewを用いてテンプレートファイルにHello Worldを表示」してみましょう。以下コードを記載します。

Views.py

from django.views.generic import TemplateView

class Index(TemplateView):
    template_name = "Index.html"

クラスビュー内はtemplate_nameでレンダリングするテンプレートのディレクトリを指定するのみでOKです。

urls.py

from django.urls import path
from .(views.pyのディレクトリ名) import views          

urlpatterns = [
    path("",views.Index.as_view(), name="Index"),
    ]

クラスベースビューをpathに指定する場合は、as_view()メソッドを必ず記載しましょう。

Templateファイル(Index.html)

<!DOCTYPE html>
<html lang="ja" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <h1>Hello World</h1>
  </body>
</html>

非常にシンプルに実装できますね!

別の記述方法としてurls.pyに直接TemplateViewをインポートし、as_view()メソッドにテンプレートを引数として渡してレンダリングすることも可能です。その場合urls.pyは下記のように記載でき、views.pyでの記載は不要となります。

urls.py

from django.urls import path
from django.views.generic import TemplateView

urlpatterns = [
    path("",TemplateView.as_view(template_name = "Index.html"), name="Index")
    ]

【実践】テンプレートファイルに変数を渡す

Viewクラスからテンプレートファイルに変数(message)を渡し、画面表示する方法について解説します。

views.py

from django.views.generic import TemplateView

class Index(TemplateView):

    #テンプレートファイル連携
    template_name = "Index.html"

    #変数を渡す
    def get_context_data(self,**kwargs):
         context = super().get_context_data(**kwargs)
         context["message"] = "Template Viewの変数"
         return context

get_context_data関数をオーバーライドすることで、テンプレートに渡す変数が指定できます。コードの書き方はまず、引数に可変長引数(**kwargs)を渡します。続いて、最初の行にスーパクラスを実行して親クラスのコンテキストを取得した後、後続の処理を記載する流れです。

テンプレートに渡す変数は、context[“変数名”] = 値のように記述しましょう。

urls.py

from django.urls import path
from .(views.pyのディレクトリ名) import views        

urlpatterns = [
    path("",views.Index.as_view(), name="Index"),
    ]

Templateファイル(Index.html)

<!DOCTYPE html>
<html lang="ja" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <h1>Hello World</h1>
    <h2>{{ message }}</h2>
  </body>
</html>

【実践】GetとPost処理を使い分ける

TemplateViewを用いてGetとPost処理を使い分けてみましょう。上記のようにボタンをクリックすると、文字が変更されるWebアプリを実装します。以下コードを見ていきましょう。

Views.py

from django.views.generic import TemplateView
from django.shortcuts import render

class Index(TemplateView):

    #テンプレートファイル連携
    template_name = "Index.html"

    #変数
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['message'] = 'Get処理'
        return context

    #get処理
    def get(self, request, *args, **kwargs):
        return super().get(request, *args, **kwargs)

    #post処理
    def post(self, request, *args, **kwargs):
        self.kwargs["message"] = "Post処理"
        return render(request, self.template_name, context=self.kwargs)

GetおよびPost処理は、それぞれget()関数、post()関数をオーバーライドして処理内容を記述します。各関数には、引数としてrequestと可変長引数(*args、**kwargs)を渡すようにします。

urls.py

from django.urls import path
from .(views.pyのディレクトリ名) import views           

urlpatterns = [
    path("",views.Index.as_view(), name="Index"),
    ]

Templateファイル(Index.html)

<!DOCTYPE html>
<html lang="ja" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>TemplateView入門</title>
  </head>
  <body>
    <h1>Hello World</h1>
    <h2>{{ message }}</h2>
    <form method="post">
      {% csrf_token %}
      <input type="submit" value="クリック">
    </form>
  </body>
</html>

【参考】Djangoの解説記事一覧

最後までご覧いただきありがとうございました。当サイトではDjangoフレームワークを用いた解説記事を多数取り扱っております。次のように体系的に整理しておりますため学習にお役立て下さい。

Django学習に最適!

当サイトが運営するDjango記事一覧

【参考】Pythonでできること・お仕事探し

最後に

この記事が気に入ったら
フォローしてね!

本記事をシェア!
目次