PythonのWebアプリケーションフレームDjangoを使う-その2 Djangoデータベースアプリケーションの作成 -

 本記事ではDjangoにデフォルトで設定されているSQLiteを使い、データベースを使うアプリケーションを作成する。
 プロジェクト名:ex1
 アプリ名:apl1

1 Djangoプロジェクトの作成
 # django-admin startproject ex1
  ex1/
   init.py
   asgi.py
   settings.py
   urls.py
   wsgi.py

2 Djangoアプリを作成
 プロジェクトのフォルダで下記コマンドを実行
 # python3 manage.py startapp apl1
  apl1のフォルダが自動的に生成される
   apl1/
   __init__.py
    admin.py
    apps.py
    migrations
    models.py
    tests.py
    views.py
    models.py
    tests.py
    views.py

3 プロジェクトの初期設定
(プロジェクト名)/settings.pyファイルで次の2つを編集
・INSTALLED_APPS変数
・TEMPLATES変数のDIRS
(1)INSTALLED_APPS変数にアプリケーションを登録
 manage.pyがあるフォルダからのapps.pyまでのパスと定義されているクラス名を登録する
 自動生成されたapps.pyのクラス

from django.apps import AppConfig
class Apl1Config(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'apl1'

(プロジェクト名.settings.pyの抜粋)
  ’apl1.apps.Apl1Config’を追加する

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'apl1.apps.Apl1Config'
]

(2)テンプレートフォルダの指定
 HTMLテンプレートファイルを格納するフォルダを作成して登録する。ここではmanage.pyと同じディレクトリtemplatesフォルダを作成する。

BASE_DIRがmanage.pyと同じディレクトリを指すため、
‘DIRS’: [BASE_DIR/’templates’],で指定

4 URLのディスパッチの設定(urls.py)
 プロジェクトフォルダにあるurls.pyのURLパターンに該当するページが無いとき、プロジェクトフォルダにあるurls.pyのurlpatterns変数に追記して、アプリケーションフォルダ内のurls.pyを参照するようにする。
(プロジェクト名)/urls.pyに下記の赤枠内を追加

"""ex1 URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.2/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('apl1.urls')),
]

5 Djangoアプリのモデルを作成
「models.Model」クラスを継承した「Apl1Model」クラスを宣言し、科目を示す「itemname」(CharFieldで文字列型)、点数を示す「itemvalue」(IntegerFieldで整数型)を定義する

from django.db import models
# Create your models here.

class Apl1Model(models.Model):
    itemname = models.CharField(max_length=100)
    itemvalue = models.IntegerField()

6 モデルをデータベースに反映する(1) (makemigrationsコマンド)
 models.pyのデータ設計図をデータベースに書き込む前にmakemigrationsコマンドによってmodels.pyから中間の設計図(0001.pyなど)を生成する。
コマンド書式
python3 manage.py makemigrations <アプリ名>

モデルの中間ファイル”0001_initial.py”が作成される
”0001_initial.py”の内容

7 モデルをデータベースに反映する(2) (migrateコマンド)
 # python3 manage.py migrate

8 Djangoアプリのモデルのテストオブジェクトを作成
(1)スーパーユーザの作成
  # python3 manage.py createsuperuser
  Username (leave blank to use ‘root’): user
  Email address: user@sample.com
  Password:
  Password (again):
  The password is too similar to the username.
  This password is too short. It must contain at least 8   characters.
  This password is too common.
  Bypass password validation and create user anyway? [y/N]: y
  Superuser created successfully.

(2)サーバの起動
  # python3 manage.py runserver

(3)管理画面にログイン
  http://127.0.0.1:8000/admin/」へアクセスしてログインする

GroupsとUsersというユーザに関わる情報が表示される。アプリのデータモデルを管理画面上で表示、追加/削除するには、admin.pyファイルで定義する必要がある。

(4)管理画面にデータモデルを表示するように変更
 admin.site.register()メソッドの引数に作成したモデル「Apl1Model」を指定する。

from django.contrib import admin
from .models import Apl1Model
# Register your models here.
admin.site.register(AppModel)

 ・サーバの再起動
  # python3 manage.py runserver

 ・管理画面にログイン
  http://127.0.0.1:8000/admin/」へアクセスしてログインする

(5)管理画面からテストオブジェクトを追加

3科目の成績データを入力

9 成績一覧を表示
(1)URLの準備
 (アプリ名)/urls.pyの編集

from django.urls import path
from . import views
from .views import Apl1List
urlpatterns = [
    path('', views.index, name='index'),
    path('list/', Apl1List.as_view()),
]

 Djangoには関数ベースのビューと、クラスベースのビューの2種類があり、クラスベースは利用する時にas_view() クラスメソッドからviewオブジェクトを生成する。

(2)ビューの準備
 (アプリ名)/views.pyの編集

from django.shortcuts import render
from django.views.generic.list import ListView
from .models import Apl1Model
# Create your views here.
from django.http import HttpResponse
def index(request):
 return HttpResponse("Hello, world")
class Apl1List(ListView):
    template_name = 'list.html'
    model = Apl1Model

(3)HTMLテンプレートファイルの準備
 list.htmlファイルは、settings.py内のTEMPLATES変数のDIRSで設定した’templates’フォルダ直下に作成
Django Template Language (DTL)を使って書く

{% for item in object_list %}
<ul>
<li>{{ item.itemname }}</li>
<li>{{ item.itemvalue }}</li>
</ul>
{% endfor %}

(4)ページの確認
 サーバを再起動して、
 ”http://127.0.0.1:8000/list/”へアクセス
 # python3 manage.py runserver

The end