【Python】Django ~ 基本編 / Class-based View ~

■ はじめに

https://dk521123.hatenablog.com/entry/2022/08/07/121017

の続き。

今回は、前回のサンプルをベースにビューの表示の仕方について学ぶ。

目次

【1】ビューの種類
 1)関数ベースビュー(Function Based Views)
 2)クラスベースビュー(Class-based View)
【2】Class-based View の種類
【3】サンプル
 0)前提条件
 例1:Generic Base - TemplateView
 例2:データを渡す - get_context_data
【3】トラブル
 1)エラー「TemplateDoesNotExist」が表示

【1】ビューの種類

Django のビューの種類は、以下の通り。
~~~~
1)関数ベースビュー(Function Based Views)
2)クラスベースビュー(Class-based View)
~~~~

使い分けは、以下のサイトを参照。

https://zenn.dev/ikemo/articles/django-class-based-view-or-function-based-view

1)関数ベースビュー(Function Based Views)

* 関数によりビューを表示する
 => 以下の関連記事のサンプルを参照

https://dk521123.hatenablog.com/entry/2022/08/07/121017

2)クラスベースビュー(Class-based View)

* クラスによりビューを表示する
 => 今回のテーマ
* 「汎用クラスビュー」「汎用ビュー」とも呼ばれる

【2】Class-based View の種類

* Class-based View には、多数のビューが用意されている
 => 詳細は、以下の公式サイトを参照。

https://docs.djangoproject.com/en/4.1/ref/class-based-views/

* 主なビュークラスは、以下の通り。
~~~~
1)Generic Base : 基本的な汎用ビュークラス
2)Generic List : 一覧表示用ビュー
3)Generic Detail : 詳細表示用ビュー
4)Generic Edit : 更新表示用ビュー
~~~~

【3】サンプル

0)前提条件

https://dk521123.hatenablog.com/entry/2022/08/07/121017

で、プロジェクト作成ができていること

フォルダ構成

helloworld
 + templates <= ADD
  + index.html <= ADD
 + helloworld
  + urls.py <= FIX
  + settings.py <= FIX
  + views.py <= ADD

例1:Generic Base - TemplateView

helloworld/urls.py

from django.contrib import admin
from django.urls import path
from helloworld.views import HelloWorldView # ADD


urlpatterns = [
    path('admin/', admin.site.urls),  # FIX
    path('helloworld/', HelloWorldView.as_view()),  # ADD
]

helloworld/settings.py

# 一部のみ
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')], # FIX
        'APP_DIRS': True,

helloworld/views.py

from django.views.generic import TemplateView


class HelloWorldView(TemplateView):
  template_name = "index.html"

templates/index.html

<div>Hello World...</div>

動作確認

~~~~
python ./helloworld/manage.py runserver
~~~~
などで、サーバを起動した状態で
ブラウザで以下のURLにアクセスする
 => 「Hello World...」が表示されるはず

http://127.0.0.1:8000/helloworld/

例2:データを渡す - get_context_data

helloworld/views.py

from django.views.generic import TemplateView


class HelloWorldView(TemplateView):
  template_name = "index.html"

  # ★ここに注目★
  def get_context_data(self):
    context = super().get_context_data()
    context["value1"] = "Hello"
    context["value2"] = "World"
    context["value3"] = "!!!???"
    return context

templates/index.html

This is a sample...
<div>{{ value1 }}</div>
<div>{{ value2 }}</div>
<div>{{ value3 }}</div>

動作確認

サーバを起動した状態で
ブラウザで以下のURLにアクセスする
 => 以下が表示されるはず
~~~~~
This is a sample...
Hello
World
!!!???
~~~~~

http://127.0.0.1:8000/helloworld/

【4】トラブル

1)エラー「TemplateDoesNotExist」が表示

ブラウザでアクセスしたら、
エラー「TemplateDoesNotExist」が表示された

原因

* テンプレートを設置している場所が誤っていた

 => 以下のサイトに書いてある
  『django.template.loaders.filesystem.Loader:がどこのディレクトリが
  参照されているか書いてある』によって原因究明が掴めた

https://www.tekizai.net/entry/django_templatedosenotexist

解決案

helloworld/helloworld/templates/index.html を
helloworld/templates/index.html を移動した

関連記事

Django ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2022/08/07/121017
Django ~ 基本編 / アプリ ~
https://dk521123.hatenablog.com/entry/2022/08/09/092941
Django ~ 基本編 / model ~
https://dk521123.hatenablog.com/entry/2022/08/17/231732