7
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Djangoでのwebアプリの作成[基礎編〜Djangoディレクトリの階層説明〜]

Last updated at Posted at 2024-04-02

この記事ではDjangoの各階層にあるファイルの初期状態で書かれている内容について解説する.

前提条件

ローカルサーバーの構築までは以下のページを参照

[Django初心者]Djangoでのwebアプリの作成[基礎編〜ローカルサーバー構築まで〜]
https://qiita.com/tarakokko3233/items/46c567fb32a26a69269a

この記事では$ Python manage.py runserverによって以下の画面が表示することができることを前提とする.
ad62a72f-9820-710b-48d8-3732916e5d02.png

初期状態でのDjangoプロジェクトの階層構造

yourprojectname/
    manage.py
    
    yourprojectname/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
        
    yourappname/
        __init__.py
        admin.py
        apps.py
        migrations/
            __init__.py
        models.py
        tests.py
        views.py

おすすめは以下のようなディレクトリ構造にする

yourprojectname/
    manage.py
    
    yourprojectname/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
        
    yourappname/
        __init__.py
        admin.py
        apps.py
        migrations/
            __init__.py
        models.py
        tests.py
        views.py

    templates/

    static/
         css/ 
         js/
         img/

templatesにはhtmlテンプレートファイルをstaticにCSS,JavaScript,画像ファイルを格納することをおすすめする
yourprojectnameは任意のプロジェクト名やconfigのような名前にしてyourappnameは任意のアプリ名にする.
アプリケーションディレクトリは複数あっても問題ないので種類の異なるアプリケーション毎に作成すると良い.
それでは初期状態でのファイルの中身について説明する.

manage.py
Djangoプロジェクトに対する操作を行うための様々なコマンドラインが定義されているファイル.

yourprojectname/_ _ init _ _.py
このディレクトリがPythonのパッケージであること知らせるための空のファイル.削除しないこと.

yourprojectname/settings.py
Djangoプロジェクトの設定ファイル.

yourprojectname/urls.py
Djangoプロジェクト全体のURLの定義(エンドポイント定義)

yourprojectname/asgi.py
プロジェクトを提供するASGI互換のWebサーバーのエントリポイント

yourprojectname/wsgi.py
プロジェクトをサーブするためのWSGI互換のWebサーバーとのエントリーポイント

yourappname/_ _ init _ _.py
このディレクトリがPythonのパッケージであること知らせるための空のファイル.

yourappname/admin.py
Django管理画面でアプリケーションのモデルを管理するための設定ファイル.モデルの登録,一覧表示,編集画面の設定などを記述.

yourappname/apps.py
このアプリケーションの設定ファイル.
アプリケーションの名前,モデル,管理画面の設定などを記述する.

yourappname/migrations/_ _ init _ _.py
このディレクトリがPythonのパッケージであること知らせるための空のファイル.

migrations ディレクトリはモデル(models.py)の変更に伴い,データベースのスキーマを変更するためのデータベースマイグレーションファイルが格納される.

yourappname/models.py
アプリケーションで使用するモデルを定義するファイル.
モデルとはデータベースのテーブルと関連するフィールドのこと.

yourappname/tests.py
このアプリケーションのテストコードを記述するファイル.
モデル(models.py)やビュー(views.py)の動作を検証するためのテストコードを記述する.

yourappname/views.py
URLと処理を関連付けるビューを定義するファイル.
ユーザーからのリクエストを受け取り,処理結果を返すコードを記述する.つまりDjango側(バックエンド側)でどのような動作をするのかを記述するところである.

上記は基本的なファイル構成であり、必要に応じて追加のファイルを作成することができる.

引用Djando公式ドキュメント
https://docs.djangoproject.com/ja/4.0/intro/tutorial01/

1. manage.py

manage.py
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys


def main():
    """Run administrative tasks."""
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'yourprojectname.settings')
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)


if __name__ == '__main__':
    main()

このファイルは,Djangoの管理用コマンドを実行するために使われる.基本的に変更することのないコードである.
以下のコマンドを実行することで様々な管理処理ができる.

$ python manage.py < command >

< command >一覧

runserver
開発用のテストサーバーを起動する.
startapp
新しいDjangoアプリケーションを作成する.
makemigrations
データベースの変更をマイグレーションファイルとしてmigrationsディレクトリに生成する.
migrate
マイグレーションを実行して、データベースに変更を反映する.
createsuperuser
Djangoプロジェクトの管理サイトにアクセスするためのスーパーユーザーアカウントを作成するために使用される.

2.yourprojectname/settings.py

プロジェクトの基本設定

BASE_DIRSECRET_KEYDEBUGALLOWED_HOSTSはDjangoプロジェクトの基本的な設定を管理できる.

yourprojectname/settings.py
"""
Django settings for yourprojectname project.

Generated by 'django-admin startproject' using Django 3.2.6.

For more information on this file, see
https://docs.djangoproject.com/en/3.2/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.2/ref/settings/
"""

from pathlib import Path

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-i@g*i&+e^n!5-h=&qwc)@kw%c078$_@nrc2rj*7&+h+l(*3x=m'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []

BASE_DIR
プロジェクトのベースディレクトリのパスを保持する変数.設定ファイルやデータベースファイルなど,プロジェクト内の他のファイルやディレクトリへのパスを構築する際に使用する.

SECRET_KEY
Djangoプロジェクトの安全性を保つための秘密鍵.本番環境では,このキーを安全に保管し,外部に漏れないようにする必要がある.

DEBUG
開発中はTrueに設定するが,本番環境ではセキュリティ上の理由からFalseに設定する必要がある.

ALLOWED_HOSTS
Djangoアプリケーションが応答を返すことが許可されているホスト名のリスト.

デフォルトでは何も書かれていないが,ローカル環境で実行するには以下の設定にする必要がある.

yourprojectname/settings.py
ALLOWED_HOSTS = ['localhost',
                 '127.0.0.1',]

PaaS環境などにデプロイするときはPaaS上のホスト名(ドメイン名)を入力する必要がある.

yourprojectname/settings.py
  ALLOWED_HOSTS = ['yourprojectname.onrender.com',#renderにデプロイするとき
                   'yourprojectname.herokuapp.com',#herokuにデプロイするとき
                   'localhost',
                   '127.0.0.1',]

アプリケーションとミドルウェアの設定

yourprojectname/settings.py
# Application definition

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

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

INSTALLED_APPS
プロジェクトで使用されるアプリケーションのリスト.Djangoの標準アプリケーション(管理サイト,認証システムなど)およびカスタムアプリケーションが含まれる.

リスト内の各アイテムについて簡単に説明する.これらの設定はデフォルトで記述されている.

django.contrib.admin
Djangoの管理サイト.データベースのモデルをWebインターフェース経由で追加,編集,削除できる.
django.contrib.auth
認証システム.ユーザーの登録,ログイン,ログアウトなどを扱う.
django.contrib.contenttypes
コンテンツタイプフレームワーク.モデル間の関連付けを動的に作成することができる.
django.contrib.sessions
セッションフレームワーク.ユーザーセッションの管理を行う.
django.contrib.messages
メッセージフレームワーク.一時的なメッセージ(成功通知やエラーメッセージなど)の表示を扱う.
django.contrib.staticfiles
静的ファイル(CSS,JavaScript,画像など)の管理を扱う.

アプリケーションディレクトリを作成したらsetting.pyに,以下のコードを記述する

yourprojectname/settings.py
INSTALLED_APPS = [
   ...
   'yourappname',
]

DjangoRestFramework(API開発用のフレームワーク)を使うときは以下のコードを記述する.

yourprojectname/settings.py
INSTALLED_APPS = [
   ...
   'rest_framework',
]

MIDDLEWARE: リクエストとレスポンスの処理中に実行されるミドルウェアのリスト.セキュリティ,セッション管理,認証などの機能を提供する.基本的には何も追加しなくても問題ない.

URLとテンプレートファイルとWSGIの設定

yourprojectname/settings.py
ROOT_URLCONF = 'yourprojectname.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'yourprojectname.wsgi.application'

ROOT_URLCONF
プロジェクトのルートURLconfのPythonパス.(urls.pyの場所を指定)Djangoはこの設定を使用して,HTTPリクエストを適切なビューにルーティングする.

TEMPLATES
Djangoプロジェクトのテンプレートエンジンの設定を定義している.テンプレートエンジンは,DjangoがHTMLやその他のテキストファイルを動的に生成する際に使用する仕組み.具体的には,この設定はどのテンプレートエンジンを使用するか,テンプレートファイルがどこにあるか,そしてテンプレートをレンダリングする際にどのようなオプションやコンテキストプロセッサを利用するかを指定している.

例えばhtmlファイルを格納するtemplatesフォルダを作成した際,プロジェクトと結合させるには以下のコードを記述する.

yourprojectname/settings.py
'DIRS': [os.path.join(BASE_DIR, 'templates')],

上記の設定では,os.path.join(BASE_DIR, 'templates')を使ってBASE_DIR(プロジェクトのベースディレクトリ)と'templates'(htmlファイルが保存されるサブディレクトリ)のパスを結合している.これにより、DjangoはBASE_DIR/templatesディレクトリ内のテンプレートファイルを検索できるようになる.

WSGI_APPLICATION
WSGIアプリケーションのPythonパス.DjangoアプリケーションとWebサーバー間のインターフェースとして機能する.

WSGIとは

WSGI(Web Server Gateway Interface)は,Pythonプログラム(Webアプリケーション)とWebサーバー間の標準インターフェース.WSGIはPythonのWebアプリケーション開発のための仕様であり,アプリケーションとWebサーバーが互いに通信する方法を定義している.これにより,さまざまなWebフレームワークやWebサーバーが互換性を持って動作できるようになる.

データベース設定

yourprojectname/settings.py
# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

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

DATABASES
使用するデータベースの設定.デフォルトでは,SQLiteデータベースが使用されている.

PostgreSQLを使用する場合は以下のように記述する.データベース名やホストやパスワードなどは自分のデータベースサーバーの情報を参照する.

yourprojectname/settings.py
DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.postgresql',#PostgreSQL用エンジン
       'NAME': 'databasename',  # データベース名
       'USER': 'username',  # ユーザー名
       'PASSWORD': 'password',  # パスワード
       'HOST': 'host',  # ホスト
       'PORT': '5432',  # ポート
   }
}

MySQLを使用する場合は以下のように記述する.

yourprojectname/settings.py
DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.mysql',#MySQL用エンジン
       'NAME': 'databasename',  # データベース名
       'USER': 'username',  # ユーザー名
       'PASSWORD': 'password',  # パスワード
       'HOST': 'host',  # ホスト
       'PORT': '3306',  # ポート
   }
}

デプロイ時やgitに公開するはセキュリティ上の観点からデータベース接続情報を直接setting.pyに書かずに環境変数を使用すること.詳しくは以下の記事を参照すること.
https://qiita.com/tarakokko3233/items/bb63dbef9d91f44d3917

認証と国際化

yourprojectname/settings.py
# Password validation
# https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/3.2/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

AUTH_PASSWORD_VALIDATORS
パスワードの強度を検証するためのバリデータのリスト.

LANGUAGE_CODE
デフォルトの言語コード.

TIME_ZONE
デフォルトのタイムゾーン.

日本語や日本時間にしたいならば以下のように記述する.

yourprojectname/settings.py
LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

USE_I18N = True

USE_L10N = True

USE_TZ = True

静的ファイルの設定

yourprojectname/settings.py
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/

STATIC_URL = '/static/'

STATIC_URL
静的ファイル(CSS、JavaScript、画像など)が提供されるURLのパス.

アプリケーションディレクトリにstaticファイルを作成したならば以下のコードを追記する.これはプロジェクトレベルの静的ファイル(例えば、JavaScriptやCSSライブラリなど、アプリケーション間で共有される静的ファイル)を管理するために使用される.

yourprojectname/settings.py
STATICFILES_DIRS = [
   os.path.join(BASE_DIR, 'yourappname', 'static'),#アプリケーションディレクトリのstaticファイルを指定する例
]

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

os.path.joinを使用してBASE_DIR(プロジェクトのベースディレクトリ)とアプリケーションの名前(この場合はyourappname),そしてそのアプリケーション内のstaticディレクトリのパスを結合している.
PaaS環境などにデプロイする際に静的ファイルにアクセスするために必要な設定である

その他の設定

yourprojectname/settings.py
# Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

DEFAULT_AUTO_FIELD
新しいモデルを作成する際に使用されるプライマリキーフィールドのデフォルトの型.

3.yourprojectname/urls.py

yourprojectname/urls.py
"""yourprojectname 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

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

このファイルは,ユーザーがWebブラウザで特定のURLにアクセスしてきた際の挙動を指定し,各URLパターンと、そのURLに対応して呼び出されるビュー関数を紐付ける.ビュー関数はHTMLの生成、データベース処理などを行い,views.pyで記述する.

また,python manage.py runserverを実行し,
http://127.0.0.1:8000/admin
にアクセスすればDjangoの管理ページに遷移するようなコードが書かれている.

Djangoの管理ページにアクセスするにはスーパーユーザアカウントを作成する必要がある.以下を実行してスーパーユーザを作成して,作成したアカウントでログインすること.

$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py createsuperuser

コマンドを実行すると,ユーザー名(username)メールアドレス(email address)(任意)パスワード(password) を設定するためのプロンプトが表示される.入力後,指定した認証情報でスーパーユーザーアカウントが作成される.

Djangoプロジェクトにおいて,createsuperuserコマンドを実行する前に、データベースのマイグレーションが完了するため,先にmakemigrationsmigrateコマンドを実行する.
Djangoのユーザーを格納するためのauth_userテーブルをデータベースに適用する必要があるためである.

4.yourprojectname/asgi.py

yourprojectname/asgi.py
"""
ASGI config for yourprojectname project.

It exposes the ASGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/3.2/howto/deployment/asgi/
"""

import os

from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'yourprojectname.settings')

application = get_asgi_application()

DjangoプロジェクトのASGI(Asynchronous Server Gateway Interface)設定ファイルの例.

ASGIは,Djangoが非同期Webサーバーと通信するための標準インターフェースで,WebSocketsや長期間のHTTP接続など,非同期プロトコルのサポートを可能にする.

基本的に変更は不要である.

5.yourprojectname/wsgi.py

yourprojectname/wsgi.py
"""
WSGI config for yourprojectname project.

It exposes the WSGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/3.2/howto/deployment/wsgi/
"""

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'yourprojectname.settings')

application = get_wsgi_application()

DjangoプロジェクトのWSGI(Web Server Gateway Interface)設定ファイルの例.

WSGIは,PythonアプリケーションとWebサーバー間の標準インターフェースで,Djangoを含む多くのPython Webフレームワークで広く採用されている.

基本的に変更は不要である.

6.yourappname/admin.py

yourappname/admin.py
from django.contrib import admin

# Register your models here.

例えば以下のようにモデルを定義したとする.

yourappname/models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    published_date = models.DateField()

このときadmin.pyを以下のようにする.

yourappname/admin.py
from django.contrib import admin
from .models import Book

admin.site.register(Book)

Bookモデルが管理サイト(http://127.0.0.1:8000/admin)
に登録されるので視覚的にデータベーステーブルを管理できる.

管理サイトでできることを増やすには以下のコードを記述する.

yourappname/admin.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
   list_display = ('title', 'author', 'published_date')  # 一覧に表示するフィールド
   list_filter = ('author',)  # フィルタサイドバーに表示するフィールド
   search_fields = ('title', 'author')  # 検索ボックスで検索可能なフィールド

admin.site.register(Book, BookAdmin)

管理サイトの表示をカスタマイズしたい場合は,ModelAdminクラスを使用して,表示するフィールドやフィルタ,検索機能などを細かく設定できる.
また,管理サイトにアクセスせずともGUIのデータベース管理ソフトを使用しても良い.

7.yourappname/apps.py

yourappname/apps.py
from django.apps import AppConfig


class YourappnameConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'yourappname'

Djangoのアプリケーション設定クラスの定義例である.Djangoプロジェクトでは,アプリケーションごとにこのような設定クラスを定義し,アプリケーションのメタデータや設定をDjangoに伝える.AppConfigクラスを継承して,特定のアプリケーション設定をカスタマイズする.

このアプリケーション設定ファイル(apps.py)をプロジェクトに適用するには以下のコードをsettings.pyに記述する.

yourprojectname/settings.py
INSTALLED_APPS = [
   ...
   'yourappname.apps.YourappnameConfig',
   ...
]

7.yourappname/models.py

yourappname/models.py
from django.db import models

# Create your models here.

Djangoプロジェクトにおけるデータモデルの定義をする.これらのモデルは,アプリケーションのデータ構造を表し,DjangoのORM(Object-Relational Mapping)を通じてデータベースにマッピングされる.models.pyでモデルを定義することにより,Djangoが提供するデータベース抽象化層を利用して,SQLコードを直接書かずにデータベース操作を行えるようになる.
以下はBookモデルの例.Djangoは主キーとしてid属性が自動的に割り振られるので記述は不要である.

yourappname/models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)  # 文字列フィールド
    author = models.CharField(max_length=50)  # 文字列フィールド
    published_date = models.DateField()  # 日付フィールド
    isbn_number = models.CharField(max_length=13, unique=True)  # ユニークな文字列フィールド
    price = models.DecimalField(max_digits=6, decimal_places=2)  # 小数フィールド

    def __str__(self):
        return self.title

各種フィールドの説明は以下の通りである.

文字列系フィールド

CharField
短い文字列(またはテキスト)を保存するフィールド.max_lengthパラメータが必要
TextField
長い文字列(またはテキスト)を保存するフィールド.max_lengthは不要

数値系フィールド

IntegerField
整数を保存するフィールド.
BigIntegerField
より大きな範囲の整数を保存するフィールド.
DecimalField
固定小数点数を保存するフィールド.金額などの正確な小数を扱う場合に便利である.max_digits(最大桁数)とdecimal_places(小数点以下の桁数)が必要
FloatField
浮動小数点数を保存するフィールド.
日付/時刻系フィールド
DateField
日付(年,月,日)を保存するフィールド.
TimeField
時刻(時,分,秒)を保存するフィールド.
DateTimeField
日付と時刻の両方を保存するフィールド.

論理値フィールド

BooleanField
真(True)または偽(False)を保存するフィールド.
NullBooleanField
True、False、None(NULL)のいずれかを保存するフィールド(Django 3.1以降ではBooleanField(null=True)を推奨)
リレーション系フィールド.
ForeignKey
他のモデルへの多対一のリレーションを定義するフィールド.
OneToOneField
他のモデルへの一対一のリレーションを定義するフィールド.
ManyToManyField
他のモデルへの多対多のリレーションを定義するフィールド.

その他のフィールド

EmailField
電子メールアドレスを保存するフィールド.CharFieldの特殊な形式で,電子メールアドレスのバリデーションを自動的に行う.
FileField(ImageField)
ファイルや画像を保存するフィールド.ImageFieldはFileFieldの特殊な形式で,アップロードされたオブジェクトが有効な画像であることを検証する.

モデルの登録とマイグレーション

モデルを定義したら,それをデータベースに反映させるためにマイグレーションを作成し、適用する必要がある.マイグレーションは,モデルの変更をデータベーススキーマに適用するための手段である.以下のコマンドを実行して,マイグレーションファイル(migrationsディレクトリ内に生成される)を生成し,データベースに適用する.

$ python manage.py makemigrations #マイグレーションファイルを生成する
$ python manage.py migrate #データベースに適用する

8.yourappname/tests.py

yourappname/tests.py
from django.test import TestCase

# Create your tests here.

Djangoプロジェクトのコンポーネントに対する自動テストを書くことができる.テストは,アプリケーションが期待どおりに動作することを保証するための重要な手段である.

モデルのテスト

モデルのテストでは,データベースの操作が期待どおりに動作するかを確認する.例えば,あるBookモデルがあるとして,そのモデルのインスタンスを作成し,適切に保存できるかをテストする.

yourappname/tests.py
from django.test import TestCase
from .models import Book

class BookModelTest(TestCase):
    def test_book_creation(self):
        book = Book(title="Django for Beginners", author="William S. Vincent", published_date="2018-01-01")
        book.save()  # モデルをデータベースに保存
        self.assertEqual(book.title, "Django for Beginners")
        self.assertEqual(book.author, "William S. Vincent")
        self.assertIsNotNone(book.id)  # 保存後にはidが自動的に割り当てられる

ビューのテスト

後述するviews.pyでのビューのテストをする.

yourappname/tests.py
from django.test import TestCase
from django.urls import reverse

class HomePageTest(TestCase):
    def test_home_page_status_code(self):
        response = self.client.get(reverse('home'))  # 'home'はビューのname属性
        self.assertEqual(response.status_code, 200)

    def test_view_uses_correct_template(self):
        response = self.client.get(reverse('home'))
        self.assertTemplateUsed(response, 'home.html')  # home.htmlテンプレートが使用されているか

ビューのテストでは,ウェブリクエストをシミュレートして,期待されるレスポンスが得られるかを確認する.例として,あるビューが正常にHTTP 200ステータスを返すかテストする.

テストの実行

テストを書いたら,以下のコマンドでテストを実行できる.

$ python manage.py test

9.yourappname/views.py

yourappname/views.py
from django.shortcuts import render

# Create your views here.

Djangoでビューを作成する際,ビューはアプリケーションのロジックを担当する.これはユーザーからのリクエストを受け取り,必要なデータをモデルから取得(または更新)し,適切なレスポンスをユーザーに返す役割を持っていることを意味する.

yourappname/views.py
from django.http import HttpResponse

def hello_world(request):
    return HttpResponse("Hello, World!")

このコードは関数hello_worldを呼び出したら"Hello, World!"が返ってくるシンプルなものである.urls.pyに以下のコードを追加してローカルサーバーを立ち上げて
http://127.0.0.1:8000/hello

ローカルサーバの立ち上げ方

$ python manage.py runserver

これをカレントディレクトリがプロジェクトのルートディレクトリであることを確認して実行すればよい.

にアクセスすれば"Hello, World!"と表示される.

yourprojectname/urls.py
from django.urls import path
from .views import hello_world

urlpatterns = [
    ...
    path('hello/', hello_world, name='hello_world'),
]

またhtmlテンプレートファイルを表示させるならば以下のコードをviews.pyに記述する.例えばtemplatesフォルダ内にhome.htmlがあるとする.

yourappname/views.py
from django.shortcuts import render

def home_page(request):
    return render(request, 'home.html')

そして,.urls.pyに以下のコードを追加してローカルサーバーを立ち上げて
http://127.0.0.1:8000/home
にアクセスすればhome.htmlが表示される.

yourprojectname/urls.py
from django.urls import path
from .views import home_page

urlpatterns = [
    ...
    path('home', home_page, name='home'),
]

このようにviews.pyでは,htmlテンプレートを表示したり,データのやり取りをすることができる.

以上がプロジェクトを作成しアプリケーションを作成した際の初期状態でのファイルの中身の説明である.各ファイルに色々記述していくことでwebページ,webアプリ,webAPIの作成が可能である.

最終的には以下のようディレクトリにするのが望ましい

再掲

yourprojectname/
    manage.py
    
    yourprojectname/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
        
    yourappname/
        __init__.py
        admin.py
        apps.py
        migrations/
            __init__.py
        models.py
        tests.py
        views.py

    templates/

    static/
         css/ 
         js/
         img/

templatesにはhtmlテンプレートファイルをstaticにCSS,JavaScript,画像ファイルを格納することをおすすめする
yourprojectnameは任意のプロジェクト名やconfigのような名前にしてyourappnameは任意のアプリ名にする.
アプリケーションディレクトリは複数あっても問題ないので種類の異なるアプリケーション毎に作成すると良い.

これで各階層の説明は終わりである
あとはビューなどに記述していくことでサーバーサイドの動きを定義できるので試して欲しい。

7
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?