こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!
TemplateView(テンプレートビュー)とは?
TemplateViewはクラスベースビューの中でも最もよく用いられるViewクラスであり、簡単にテンプレートファイルやモデルと連携できるメリットがあります。View関数と比較して少ないコードで多様な機能を実装できるのが特徴です。
クラスベースビューの基本概念は下記記事で紹介しています。適時ご参照ください。
【Django】クラスベースビュー基本操作入門|PythonによるWebアプリ開発#12
クラスベースビュー(Class Based View)の概要説明した記事です。 「そもそもクラスベースビューとは何か?」「ビュークラスとビュー関数の記述方法の違いは?」「代表的なクラスベースビューではどんなことができる?」このような疑問にお応えします。
それでは下記より実際にTempalteViewを用いたWebアプリを作成しながらTemplateViewの基本操作に慣れていきましょう!
事前準備
ディレクトリ構成
上記のディレクトリ構成をもとに進めて参ります。下記以降で主に取り扱うファイルは以下になります。
- views.py(アプリケーションフォルダ)
- urls.py(プロジェクトフォルダ)
- Index.html(テンプレート)
ここでテンプレートファイルは、settings.pyのディレクトリ設定に基づき、views.pyから直接ファイル指定できる前提とします。テンプレートファイルのディレクトリ設定は下記の記事で紹介していますため、適時ご参照ください。
【Django】テンプレートの作成・HTML/CSS表示|PythonによるWebアプリ開発(Template)#4
Djangoフレームワークを活用するテンプレートの概要および基礎的な活用方法を詳しく知りたい方向けです。まず、Djangoフレームワークにおけるテンプレートの役割をご紹介します。続いて実際の構築・コーディング説明をもとに、HTML/CSSコードを画面に表示させる手順を実演します。
【実践】テンプレートファイルを表示する
「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でできること・お仕事探し
最後に
お問い合わせフォーム
上記課題に向けてご気軽にご相談下さい。
お問い合わせはこちら