Djangoで複数アプリケーション構成にするときのTips

iXIT株式会社 小長谷です。

DjangoはWebアプリの各種設定情報を管理するための仕組みとして、「プロジェクト」を使用します。さらに「プロジェクト」内で、Webアプリのためのモジュールを作成します。

1つのアプリケーションに対し1つのフォルダが作成されるため、複数のアプリケーションを作成する場合管理がしづらいと考え、新たにappsフォルダを作成してまとめる構成で開発を行いました。
また、ビュー用のtemplateファイルもtemplatesフォルダに、その他静的ファイルもstaticフォルダにまとめました。

開発時にsettings.pyに追加するものなど、つまずいた箇所を記載していきます。

バージョン

Python: 3.9.6
Django: 3.2.5

プロジェクト、アプリケーションを作成

プロジェクト名を仮に、bookProjectという名前にします。
django-admin startproject bookProject
cd bookProject
startappコマンドでフォルダを指定する場合、予めフォルダを作成する必要があります。
mkdir -p apps/book
python manage.py startapp book apps/book
アプリケーションを追加する場合、上記のようにapps配下に作成していきます。

フォルダ構成図

templatesフォルダ、staticフォルダを作成した後の全体図は以下のようになります。

├── bookProject
│   ├── __init__.py
│   ├── __pycache__
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── apps
│   ├── book
│       ├── __init__.py
│       ├── __pycache__
│       ├── admin.py
│       ├── apps.py
│       ├── migrations
│       ├── models.py
│       ├── tests.py
│       └── views.py
├── db.sqlite3
├── manage.py
├── static
│   └── css
│       └── base.css
└── templates
    ├── base.html
    └── book
        └── index.html

settings.py

bookProject/settings.py

# 追加
import os

# ~~ 途中省略 ~~

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 追加
    'apps',
]

# ~~ 途中省略 ~~

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            # 追加
            os.path.join(BASE_DIR, 'templates'),
        ],
        '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',
            ],
        },
    },
]

# ~~ 途中省略 ~~

STATIC_URL = '/static/'
# 追加
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'),)

ルーティング

bookProject/urls.py

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

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

bookフォルダ内にurls.pyを作成します。
apps/book/urls.py

from django.urls import path
from . import views

app_name = 'book'

urlpatterns = [
    path('', views.IndexView.as_view(), name='book_index'),
]

ビュー

apps/book/views.py

from django.shortcuts import render
from django.views.generic import TemplateView


class IndexView(TemplateView):
    template_name = 'book/index.html'

テンプレート

templates/base.html

{% load static %}

<!-- 省略 -->

<link rel="stylesheet" href={% static 'css/base.css' %}>

templates/book/index.html

{% extends 'base.html' %}

<!-- 省略 -->

<a href={% url 'book:book_index' %}>bookへ</a>