Python | Django | class-based viewsのTemplateViewの使い方

2021年8月17日

公開日:2021/8/17

Pythonには,DjangoというWebアプリケーションフレームワークがある.フレームワークのため,Djangoを利用するとWebアプリを通常よりも短時間で開発することが可能になる.

class-based viewsは,viewsを実装する手段の1つであり,関数の代わりにPythonのオブジェクトとしてviewsを定義する.viewsの作成とデータの追加・更新・削除が容易になる.

前記事では,「class-based viewsの基本的な実装方法」を作成した.前記事での設定をそのまま引き継いだ上で,本記事では,「class-based viewsのTemplateViewの使い方」を以下4つの構成にて記す.

  1. ページの表記方法1
  2. ページの表記方法2
  3. 値を渡す方法
  4. 参照

◆実施環境

Python 3.8.8
Django 3.2.3
VS Code 1.59.0

■class-based viewsのTemplateViewの使い方

  1. ページの表記方法1

“templates"に"home.html"を以下のように作成する.

“templates/home.html"を以下のように編集する.

<h2>Hello World!<br>
This is Home Page!</h2>

“ec_site/urls.py"に追記し,以下のように編集する.

from django.urls import path
from .views import TopView
from django.views.generic.base import TemplateView # 追記箇所

app_name = 'ec_site'

urlpatterns = [
    path('top/', TopView.as_view(), name='top'),
    path('home/', TemplateView.as_view(template_name='home.html'), name='home'), # 追記箇所
]

VS Codeの"View"を開き,ターミナルをクリックする.ターミナルが開くので,”conda activate 仮想環境名”を実行し,仮想環境に移行する(移行方法の詳細はこちら).その後,ターミナルで"cd class_based_view"を入力し,ディレクトリを変更する.変更後,以下のように”python manage.py runserver”を実行する.以下が出力される.

(djangoenv) C:\Users\shiro\Desktop\210517_python development\myclassbasedviewtest\class_based_view
>python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced). # 以下出力箇所
August 17, 2021 - 02:33:15
Django version 3.2.3, using settings 'class_based_view.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

上記の"http://127.0.0.1:8000/"をクリックすると,ブラウザが開き,以下画面が出力される.

“http://127.0.0.1:8000/ec_site/home"をクリックすると,以下画面に遷移する.

  1. ページの表記方法2

“ec_site/urls.py"を以下のように編集する.

from django.urls import path
from .views import TopView, HomeView # 変更箇所

app_name = 'ec_site'

urlpatterns = [
    path('top/', TopView.as_view(), name='top'),
    path('home/', HomeView.as_view(), name='home'), # 追記箇所
]

“ec_site/views.py"に追記し,以下のように編集する.

from django.shortcuts import render
from django.views.generic.base import (
    View, TemplateView # 変更箇所
)
from . import forms

class TopView(View):

    def get(self, request, *args, **kwargs):
        medicine_form = forms.MedicineForm()
        return render(request, 'top.html', context={
            'medicine_form': medicine_form,
        })

    def post(self, request, *args, **kwargs):
        medicine_form = forms.MedicineForm(request.POST or None)
        if medicine_form.is_valid():
            medicine_form.save()
        return render(request, 'top.html', context={
            'medicine_form': medicine_form,
        })

class HomeView(TemplateView): # 以下追記箇所

    template_name = 'home.html'

ターミナルを開き,"cd class_based_view"で"python manage.py runserver"を実行すると以下が出力される.

(djangoenv) C:\Users\shiro\Desktop\210517_python development\myclassbasedviewtest\class_based_view
>python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced). # 以下出力箇所
August 17, 2021 - 02:52:49
Django version 3.2.3, using settings 'class_based_view.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

上記の"http://127.0.0.1:8000/"をクリックし,ブラウザを立ち上げ,"http://127.0.0.1:8000/ec_site/home"を入力すると,以下画面に遷移する.項目1と同じ画面が出力された.

  1. 値を渡す方法

“ec_site/views.py"に追記し,以下のように編集する.

from django.shortcuts import render
from django.views.generic.base import (
    View, TemplateView
)
from . import forms
import random # 追記箇所

class TopView(View):

    def get(self, request, *args, **kwargs):
        medicine_form = forms.MedicineForm()
        return render(request, 'top.html', context={
            'medicine_form': medicine_form,
        })

    def post(self, request, *args, **kwargs):
        medicine_form = forms.MedicineForm(request.POST or None)
        if medicine_form.is_valid():
            medicine_form.save()
        return render(request, 'top.html', context={
            'medicine_form': medicine_form,
        })

class HomeView(TemplateView):

    template_name = 'home.html'

    def get_context_data(self, **kwargs): # 以下追記箇所
        context = super().get_context_data(**kwargs)
        context['alphabet'] = random.randint(0, 9999)
        return context

“templates/home.html"に追記し,以下のように編集する.

<h2>Hello World!<br>
This is Home Page!</h2>
<p>My favorite number is {{ alphabet }}!</p>

ターミナルを開き,"cd class_based_view"を入力し,"class_based_view"のディレクトリに移動する.その後,"python manage.py runserver"を実行すると以下が出力される.

(djangoenv) C:\Users\shiro\Desktop\210517_python development\myclassbasedviewtest\class_based_view
>python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced). # 以下出力箇所
August 17, 2021 - 03:37:05
Django version 3.2.3, using settings 'class_based_view.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

上記の"http://127.0.0.1:8000/"をクリックし,ブラウザを立ち上げ,"http://127.0.0.1:8000/ec_site/home"を入力すると,以下画面に遷移する.赤枠のメッセージが追加された.なお,赤枠の数字はランダムで変化する.

“ec_site/urls.py"を以下のように編集する.

from django.urls import path
from .views import TopView, HomeView

app_name = 'ec_site'

urlpatterns = [
    path('top/', TopView.as_view(), name='top'),
    path('home/<name>', HomeView.as_view(), name='home'), # 変更箇所
]

“ec_site/views.py"を以下のように編集する.

from django.shortcuts import render
from django.views.generic.base import (
    View, TemplateView
)
from . import forms
import random

class TopView(View):

    def get(self, request, *args, **kwargs):
        medicine_form = forms.MedicineForm()
        return render(request, 'top.html', context={
            'medicine_form': medicine_form,
        })

    def post(self, request, *args, **kwargs):
        medicine_form = forms.MedicineForm(request.POST or None)
        if medicine_form.is_valid():
            medicine_form.save()
        return render(request, 'top.html', context={
            'medicine_form': medicine_form,
        })

class HomeView(TemplateView):

    template_name = 'home.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['name'] = kwargs.get('name') # 追記箇所
        context['alphabet'] = random.randint(0,9999)
        return context

“templates/home.html"を以下のように編集する.

<h2>Hello World!<br>
This is Home Page!</h2>
<p>{{ name }}'s favorite number is {{ alphabet }}!</p>

ターミナルを開き,"class_based_view"のディレクトリで"python manage.py runserver"を実行すると以下が出力される.

(djangoenv) C:\Users\shiro\Desktop\210517_python development\myclassbasedviewtest\class_based_view
>python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced). # 以下出力箇所
August 17, 2021 - 03:56:00
Django version 3.2.3, using settings 'class_based_view.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

上記の"http://127.0.0.1:8000/"をクリックし,ブラウザを立ち上げ,"http://127.0.0.1:8000/ec_site/home/"の後ろに名前を入力する.入力した名前が以下のように画面に含まれる.名前は,"Jotaro"とした.

  1. 参照

https://docs.djangoproject.com/ja/3.1/ref/class-based-views/base/#templateview

https://docs.djangoproject.com/en/3.2/ref/class-based-views/mixins-simple/

以上