【Django】アプリ作成までの基本的な手順

概要

Djangoフレームワークでアプリを作成するための基礎的な情報をまとめた。
プロジェクトとアプリの概念、Djangoの仕組み、DB作成方法や管理画面表示まわりについて扱う。

 

前提

環境構築ができていること。

 

あわせて読みたい

概要 これからPythonのDjangoフレームワークを学ぶにあたり、開発環境を構築する。 今回はWindowsに仮想のLinuxOS環境を用意し、その中でPythonの仮想環境を作成するところまで行う。 LinuxOSを導入する[…]

【Django】UbuntuでPython開発環境の構築

 

事前準備

Djangoのインストール

任意のフォルダ内にて、Python仮想環境を作成&有効にしてDjangoをインストールする。

ターミナル


python3 -m venv myenv
source myenv/bin/activate

ターミナル


pip install django

 

フォーマッターインストール

以下のコマンドを実行して、コードフォーマッターをインストールする。

ターミナル


pip install black

フォーマッターを使用したい場合、以下のように実行すれば自動でコードフォーマットしてくれる。

ターミナル


black フォーマットしたいフォルダ名

 

Djangoプロジェクトの作成

プロジェクト名「admin_apps」を作成する。
※プロジェクト名にあまり意味はないので、何でもいい

ターミナル


django-admin startproject admin_apps

 

初期設定

テンプレートフォルダパスの設定

テンプレートファイルを格納するフォルダパスを設定する。

settings.py


TEMPLATES = [
    {
        (略)
        "DIRS": [BASE_DIR / "templates"],
        (略)
    },
]

 

タイムゾーンと日本語設定

settings.py


LANGUAGE_CODE = "ja"
TIME_ZONE = "Asia/Tokyo"

 

 

アプリとプロジェクト

概念

「django-admin start プロジェクト名」コマンドによって作成されたプロジェクトの下に、機能ごとに分かれたアプリを作成していく。
アプリには例えば、ログイン/ログアウトまわりの認証機能や、Djangoで作成するメインとなるアプリの機能などを管理する。

モデルには各テーブル情報を定義して、それぞれのアプリでテーブルの追加更新削除等を行う。
全体像は以下のようなイメージとなる。

Djangoアプリの全体像

▲URLの中身でアプリごとのurls.pyへルーティングする

 

アプリ作成の流れ

アプリの作成

以下のコマンドを実行してアプリを作成する。※todoappsというアプリを作成している。

ターミナル


python3 manage.py startapp todoapps

 

アプリフォルダ構成

作成したtodoappsは以下のようなフォルダ構成で追加される。

作成されたアプリのフォルダ構成

 

主に使用するファイル

自動生成されたファイルの中で主に使用するのは以下のファイルとなる。

admin.py

アプリ内で作成したDB情報を管理画面で扱うための設定ファイル。

 

models.py

テーブルデータを定義するファイル。
models.pyがテーブルを作成したり、DBアクセスレイヤの役割となる。

 

views.py

todoアプリまわりのサーバー関数を定義する。

 

アプリ作成後の設定

アプリの登録

プロジェクト内のsettings.pyに、以下の命名規則で作成したアプリを登録する。
settings.pyに登録することで、Djangoフレームワークが新規作成したアプリを参照できるというイメージ。

settings.py


INSTALLED_APPS = [
    "django.contrib.admin", # 管理画面の機能をもつアプリ
    "django.contrib.auth", # 認証機能の機能をもつアプリ
    "django.contrib.contenttypes", # Content-Typeに関する機能をもつアプリ
    "django.contrib.sessions", # セッション管理の機能をもつアプリ
    "django.contrib.messages", # フラッシュメッセージの機能をもつアプリ
    "django.contrib.staticfiles", # 静的ファイル(JSやCSS)に関する機能をもつアプリ
    "todoapps.apps.TodoappsConfig" # 新規作成したアプリを登録
]

 

【アプリ名】.apps.【アプリ名Config】

 

【アプリ名】については作成したアプリ名を設定する。
【アプリ名Config】については、実際にアプリフォルダ/apps.pyに該当のクラスが定義されている。

appsconfigの定義場所

 

ルーティングファイルとテンプレートフォルダの作成

urls.pyは自動生成されないため、作成したアプリフォルダ配下に手動で作成する。
また、templatesフォルダも同じ階層に作成する。

作成したアプリへの追加項目

urls.pyの作成目的は、todoappsまわりのURLとviews内のサーバー関数を紐づけるため。
後述するが、プロジェクトのurls.pyでまず最初にリクエストを受け取り、各アプリのurls.pyにルーティングしていく流れになる。

templatesフォルダの作成目的は、HTMLテンプレートを格納するため。
settings.pyの以下の設定をTrueにすることで、各アプリ内のtemplatesフォルダ内の参照をDjango側でやってくれるようになる。

settings.py


TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [BASE_DIR / "templates"],
        "APP_DIRS": True,
    (略)
    },
]

 

アプリ内のサーバー関数作成例

hello.htmlの返却

例えば以下のように記述することで、todoapps/templates/hello.htmlをレスポンスとして返却できる。

todoapps/views.py


from django.shortcuts import render

def hello(request):
    """ Hello Worldの表示 """
    return render(request, "hello.html")

hello.htmlはtodoapps/templatesフォルダ配下に格納しておくこと。

 

ルーティング

プロジェクトとアプリのルーティング概要

以下の流れでプロジェクトのurls.pyから各アプリのurls.pyにリクエストがとんでくるイメージ。

Djangoのアプリリクエストパターン

 

プロジェクト側

admin_apps/urls.py


from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    (略)
    path("", include("todoapps.urls"))
]

include関数をインポートする。
上記は「http://localhost:8000」がリクエストされると、todoappsに定義したurls.pyを参照するという記述になる。

アプリ側

todoapps/urls.py


from django.urls import path
from .views import hello

urlpatterns = [
    path("todoapps/", hello, name="top")
]

URLに対して、views.pyのサーバー関数を紐づける記述をすればOK。

最後の引数のname属性は、views関数でリダイレクト処理等を呼び出す際に指定する。
上記のname属性を定義することで、URLに変更があったとしても他のコードへの影響を減らすことができる模様。

 

データベースの作成

models.pyにテーブル情報を記述することで、テーブルを自動生成してくれる。
そのため、自身でCREATE TABLEなどのテーブル定義を作成する必要がなくなる。

DBの種類

settings.pyにDB情報を定義している。

settings.py


DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": BASE_DIR / "db.sqlite3",
    }
}

Djangoではデフォルトでsqlite3を使用する。
今回はそのままsqlite3を使用してテーブルを追加していく。

 

models.pyの定義

今回は「TODOカテゴリテーブル」と「TODOタスクテーブル」を用意した。

todoapps/models.py


from django.db import models    
from django.contrib.auth.models import User    
    
    
class TodoCategory(models.Model):    
    """TODOカテゴリテーブル"""    
    
    category_name = models.CharField("カテゴリ名", max_length=255, null=False)    
    
    
class Todo(models.Model):    
    """TODOタスクテーブル"""    
    
    title = models.CharField("タイトル", max_length=255, null=False)    
    content = models.TextField("タスク内容", null=False)    
    memo = models.TextField("メモ", null=True, blank=True)    
    status = models.IntegerField("ステータス", null=False)    
    due_date = models.DateTimeField("期日", null=False)    
    category = models.ForeignKey(    
        TodoCategory, verbose_name="カテゴリID", on_delete=models.CASCADE    
    )    
    user = models.ForeignKey(User, verbose_name="利用者ID", on_delete=models.CASCADE)

 

DBの作成

models.pyを定義した状態で、以下のコマンドを実行する。
※アプリ名は省略可能

ターミナル


python3 manage.py makemigrations todoapps
コマンドを実行すると、「todoapps/migrations/0001_initial.py」が作成されたというログが出る。
これはDBの設計図のようなものらしい。
以下のコマンドを実行することで、DBの設計図をもとに実際にテーブルが作成される。

ターミナル


python3 manage.py migrate

上記により、当プロジェクトのテーブルが作成される。

 

DB確認

作成されたDB(db.sqlite3ファイル)を確認する。
まず、Ubuntuでsqlite3を参照できるように、OSに以下のコマンドでsqlite3アプリをインストールする。

※仮想環境が有効でも有効でなくてもどちらでもよい。

ターミナル


sudo apt install sqlite3

Ubuntuにsqlite3を導入

 

次にdb.sqlite3と同じ階層で以下のコマンドを実行する。

ターミナル


sqlite3 db.sqlite3 

ターミナル


.table

 

作成したテーブル表示

todoテーブルとtodocategoryテーブルが作成されていることがわかる。
※sqlite参照モードから抜けるには「.exit」と入力する

 

 

管理者画面機能

管理者画面にDB情報反映

管理者画面にテーブル情報を表示させるために、以下のファイルにmodels.pyで定義したクラスを参照させる。

todoapps/admin.py


from django.contrib import admin
from .models import Todo, TodoCategory

admin.site.register(Todo)
admin.site.register(TodoCategory)

 

管理ユーザーの作成

管理者画面にてログインするための管理ユーザーを作成する。

以下のコマンドを実行する。

ターミナル


python3 manage.py createsuperuser

 

管理ユーザーの作成方法

ユーザー名とパスワードを設定できる。
メールアドレスは省略可能。

 

管理者画面表示

サーバーを起動して「http://localhost:8000/admin」にアクセスすると、Djangoがもともと用意している管理者画面に遷移する。

管理者ログイン画面表示

▲Djangoには実装しなくても、もともと管理者画面が用意されている

 

作成した管理ユーザー情報を入力してログインする。

管理画面トップ表示が英語表記
▲カテゴリとタスクテーブルが表示されている

上記の状態だとテーブル名称が英語表記となっていてわかりづらい。

 

テーブル名を日本語にする方法

todoapps/models.py


from django.db import models
from django.contrib.auth.models import User


class TodoCategory(models.Model):
    """TODOカテゴリテーブル"""

    category_name = models.CharField("カテゴリ名", max_length=255, null=False)

    class Meta:
        verbose_name = "TODOカテゴリ"
        verbose_name_plural = "TODOカテゴリ"

    def __str__(self):
        return self.category_name


class Todo(models.Model):
    """TODOタスクテーブル"""

    title = models.CharField("タイトル", max_length=255, null=False)
    content = models.TextField("タスク内容", null=False)
    memo = models.TextField("メモ", null=True, blank=True)
    status = models.IntegerField("ステータス", null=False)
    due_date = models.DateTimeField("期日", null=False)
    category = models.ForeignKey(
        TodoCategory, verbose_name="カテゴリID", on_delete=models.CASCADE
    )
    user = models.ForeignKey(User, verbose_name="利用者ID", on_delete=models.CASCADE)

    class Meta:
        verbose_name = "TODOタスク"
        verbose_name_plural = "TODOタスク"

    def __str__(self):
        return self.task
 

モデル定義したら以下のコマンドでDBに反映させる。

ターミナル


python3 manage.py makemigrations
python3 manage.py migrate

 

再度表示すると、日本語名称のテーブル名が表示されている。

管理画面トップ日本語表示
トップ画面

 

管理画面でカテゴリ表示
▲TODOカテゴリ画面。管理画面で追加、更新、削除ができる。

 

管理画面でタスク表示
▲TODOタスク画面。管理画面でタスクの追加、更新、削除ができる。

 

以上のように、管理者画面はこちらが実装しなくてもテーブルにあわせて自動で用意される。

 

スポンサーリンク