5.

Django アプリケーション作成完全ガイド(startapp / INSTALLED_APPS / urls / views)

編集
この記事の要点
  • Django の アプリケーション はプロジェクト内の機能単位。1 プロジェクトに複数アプリを配置できる
  • 作成コマンド: python manage.py startapp blog でディレクトリ雛形が生成
  • 次に settings.pyINSTALLED_APPS へ追加、urls.pyinclude() ルーティング
  • 主要ファイル: views.py(リクエスト処理)/ models.py(DB)/ admin.py(管理画面)/ apps.py(設定)
  • 初期化最終ステップは python manage.py migrate、必要に応じ templates/static ディレクトリを手動作成

Django プロジェクトとアプリの違い

Django では「プロジェクト」と「アプリケーション」を分けて考えます。プロジェクトは Web サイト全体(設定・ルーティング・WSGI 等の入れ物)、アプリケーションはその中の機能モジュール(ブログ機能、ユーザー機能、API 機能など)。

用語役割作成コマンド
プロジェクト (mysite)設定 / ルーティングのトップ / WSGIdjango-admin startproject mysite
アプリ (blog)機能単位の MVT 構成python manage.py startapp blog

ステップ 1: アプリを生成

プロジェクト直下(manage.py がある階層)で次のコマンドを実行します:

# プロジェクト作成済の場合(mysite/ が存在)
cd mysite

# アプリ作成
python manage.py startapp blog

# 生成されるディレクトリ
# blog/
# ├── __init__.py
# ├── admin.py        # 管理画面登録
# ├── apps.py         # アプリ設定クラス
# ├── migrations/
# │   └── __init__.py
# ├── models.py       # DB モデル定義
# ├── tests.py        # テスト
# └── views.py        # ビュー関数 / クラス

注意: urls.pytemplates/ static/ ディレクトリは自動生成されません。後で手動で作成します。

ステップ 2: INSTALLED_APPS への登録

Django にアプリの存在を認識させるため mysite/settings.pyINSTALLED_APPS に追記します:

# mysite/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog.apps.BlogConfig',   # ← 追加(推奨: AppConfig 経由)
    # 短縮形でもOK: 'blog',
]

blog.apps.BlogConfig を指定すると、apps.py 内の設定(verbose_name など)が反映されます。短く 'blog' でも動作しますが、明示的な書き方が推奨です。

ステップ 3: ルーティング設定

プロジェクトの urls.py からアプリの urls.py をインクルードします:

# mysite/urls.py(プロジェクト側)
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls')),   # ← /blog/ 以下を blog アプリに委譲
]

アプリ側に urls.py を新規作成します(自動生成されないため):

# blog/urls.py(新規作成)
from django.urls import path
from . import views

app_name = 'blog'   # 名前空間({% url 'blog:index' %} で参照できる)

urlpatterns = [
    path('', views.index, name='index'),
    path('<int:pk>/', views.detail, name='detail'),
    path('create/', views.PostCreateView.as_view(), name='create'),
]

ステップ 4: ビューを書く

関数ベースビュー (FBV)クラスベースビュー (CBV) の 2 系統があります:

# blog/views.py
from django.shortcuts import render, get_object_or_404
from django.views.generic import CreateView
from .models import Post

# 関数ベースビュー
def index(request):
    posts = Post.objects.order_by('-created_at')[:20]
    return render(request, 'blog/index.html', {'posts': posts})

def detail(request, pk):
    post = get_object_or_404(Post, pk=pk)
    return render(request, 'blog/detail.html', {'post': post})

# クラスベースビュー(汎用ビュー)
class PostCreateView(CreateView):
    model = Post
    fields = ['title', 'body']
    template_name = 'blog/form.html'
    success_url = '/blog/'

ステップ 5: モデル定義 → マイグレーション

# blog/models.py
from django.db import models

class Post(models.Model):
    title = models.CharField('タイトル', max_length=200)
    body = models.TextField('本文')
    created_at = models.DateTimeField('作成日時', auto_now_add=True)

    class Meta:
        db_table = 'blog_post'
        ordering = ['-created_at']
        verbose_name = '記事'
        verbose_name_plural = '記事一覧'

    def __str__(self):
        return self.title
# マイグレーションファイル生成
python manage.py makemigrations blog

# DB に反映
python manage.py migrate

# 確認
python manage.py showmigrations blog

ステップ 6: 管理画面に登録

# blog/admin.py
from django.contrib import admin
from .models import Post

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ('id', 'title', 'created_at')
    search_fields = ('title', 'body')
    list_filter = ('created_at',)
    ordering = ('-created_at',)
# 管理ユーザ作成
python manage.py createsuperuser

# 起動
python manage.py runserver

# ブラウザで http://127.0.0.1:8000/admin/

ステップ 7: テンプレートと静的ファイルのディレクトリ

自動生成されないので手動で作ります:

mkdir -p blog/templates/blog
mkdir -p blog/static/blog/css
mkdir -p blog/static/blog/js
mkdir -p blog/static/blog/img

# テンプレ例
cat > blog/templates/blog/index.html <<EOF
{% extends 'base.html' %}
{% block content %}
<h1>記事一覧</h1>
<ul>
{% for post in posts %}
  <li><a href="{% url 'blog:detail' post.pk %}">{{ post.title }}</a></li>
{% endfor %}
</ul>
{% endblock %}
EOF

apps.py のカスタマイズ

# blog/apps.py
from django.apps import AppConfig

class BlogConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'blog'
    verbose_name = 'ブログ機能'

    def ready(self):
        # シグナル登録など起動時処理をここに
        import blog.signals  # noqa

FAQ

Q: アプリは小さく分けるべき?
A: Django 公式は「1 つのことをうまくこなす再利用可能な単位」を推奨。ユーザ・ブログ・API などで分けるのが定石です。

Q: アプリ名と URL prefix を合わせるべき?
A: 合わせる必要はありません。path('articles/', include('blog.urls')) も可。アプリ内 app_name で名前空間を分離します。

Q: startapp 後に名前を変えたい
A: ディレクトリ名 / INSTALLED_APPS / apps.py 内 name / migrations のテーブル名 / インポート全箇所を一括変更する必要あり。初期段階で命名を確定するのが安全です。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. インストール方法(Windows)
  2. インストール方法(Linux/Mac)
  3. プロジェクトの作成方法(Windows)
  4. プロジェクトの作成方法(Mac)
  5. アプリケーションの作成方法
  6. 開発用サーバー(Windows)
  7. 開発用サーバー(Mac)

最近更新/作成されたページ