🐍 Django入門ガイド！初心者が最高なWebアプリを作る方法✨

こんにちは😊
[株式会社プロドウガ](https://qiita.com/organizations/prodouga-com)の@YushiYamamotoです！
[らくらくサイト](https://rakuraku-site.prodouga.com/)の開発・運営を担当しながら、React.js・Next.js専門のフリーランスエンジニアとしても活動しています❗️

DjangoはPythonで作るWebアプリケーションのフレームワークで、**「完結型の開発環境**」と呼ばれる特性を持ちます。初心者が一人でプロジェクトを進められるように設計されており、**高品質なWebサービスを効率的に構築**できる点が最大の強みです。この記事では、Djangoの基本概念から実践的な開発手法まで、**エンジニアの視点で体系的に解説**します。

---

## Djangoの基本概念を理解しよう📚

DjangoはMTVアーキテクチャを採用しています。MVC（Model-View-Controller）とは異なり、**「Model（データモデル）」「Template（テンプレート）」「View（アプリケーションロジック）」**の3層構造で構成されます。

```mermaid
graph TD
    A[Model] --> B[View]
    B --> C[Template]
    C --> D[User]
    D --> A
```


### Djangoの主な特徴🚀

1. **バッテリー付きフレームワーク**：認証システムや管理画面など、**開発に必要な機能が標準で組み込まれている**
2. **ORM（Object Relational Mapping）**：SQLを直接書かず、Pythonコードでデータベース操作が可能[^1]
3. **再利用可能なコンポーネント**：アプリケーション単位で機能をパッケージ化できる

---

## 開発環境の準備🛠️

まずは開発環境の構築から始めましょう。Djangoをインストールする前に、**Pythonとpipのインストール確認**が必要です。

```bash
# Pythonのバージョン確認
python3 --version

# Djangoのインストール
pip install django
```

:::note info
Python 3.8以上が推奨されます。環境構築に迷った場合は、**VS Code拡張機能「Python Environment Manager」**を活用すると管理が容易です。
:::

---

## プロジェクトの作成📁

プロジェクトを作成するには、**django-admin startproject**コマンドを使用します。

```bash
django-admin startproject myproject
cd myproject
```

プロジェクト構成の主要ディレクトリを解説します：

1. **myproject/**：プロジェクト全体の設定ファイル
2. **myproject/settings.py**：データベース接続や中間件設定
3. **myproject/urls.py**：リクエストルーティングの設定

---

## アプリケーションの作成🔧

Djangoでは機能単位でアプリケーションを作成します。

```bash
python manage.py startapp myapp
```


### アプリケーションの登録

**settings.py**のINSTALLED_APPSにアプリ名を追加します。

```python
INSTALLED_APPS = [
    # ...
    'myapp',
]
```

---

## データモデルを定義する📝

**models.py**でデータ構造を設計します。

```python
# myapp/models.py
from django.db import models

class Task(models.Model):
    title = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)
    done = models.BooleanField(default=False)
```

モデルの変更を反映するには、**マイグレーション**が必要です。

```bash
python manage.py makemigrations
python manage.py migrate
```

---

## ビューとテンプレートの連携🔗

**views.py**でビジネスロジックを実装します。

```python
# myapp/views.py
from django.shortcuts import render
from .models import Task

def task_list(request):
    tasks = Task.objects.all()
    return render(request, 'myapp/task_list.html', {'tasks': tasks})
```

テンプレートファイルは**templates/myapp/**に配置します。

```html
<!-- templates/myapp/task_list.html -->
{% extends 'base.html' %}
{% block content %}
  <h1>Task List</h1>
  <ul>
  {% for task in tasks %}
    <li>{{ task.title }} ({{ task.done }})</li>
  {% endfor %}
  </ul>
{% endblock %}
```

---

## URLパターンの設定📍

**urls.py**でルーティングを定義します。

```python
# myproject/urls.py
from django.contrib import admin
from django.urls import path
from myapp import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('tasks/', views.task_list, name='task_list'),
]
```

---

## 開発サーバーの起動🚨

```bash
python manage.py runserver
```

ブラウザで http://localhost:8000/tasks/ にアクセスすると、タスク一覧が表示されます。

---

## テスト駆動開発の実践✅

Djangoにはテストフレームワークが標準装備されています。

```python
# myapp/tests.py
from django.test import TestCase
from .models import Task

class TaskTestCase(TestCase):
    def test_task_creation(self):
        task = Task.objects.create(title='Test task')
        self.assertEqual(task.title, 'Test task')
```

テスト実行コマンド：

```bash
python manage.py test
```

---

## デプロイ戦略🚀

開発完了後は、**HerokuやAWS Elastic Beanstalk**などのPaaSを使ったデプロイが一般的です。

```bash
# Git初期化
git init
git add .
git commit -m "Initial commit"

# Herokuアプリ作成
heroku create myapp
heroku git:remote -a myapp
git push heroku main
```

---

## 初心者が陥りがちな落とし穴⚠️

1. **マイグレーション忘れ**：モデル変更後は必ずマイグレーションを実行
2. **静的ファイル設定**：settings.pyのSTATIC_URLを正しく設定
3. **管理画面カスタマイズ**：admin.pyでモデルを登録忘れる

---

## Djangoの生態系🌍

Djangoのエコシステムは豊富で、**Django REST Framework**（API開発）、**Wagtail**（CMS）、**django-allauth**（認証機能）などが代表的です。

```mermaid
graph LR
    Django -->|拡張| REST_Framework
    Django -->|拡張| Wagtail
    Django -->|拡張| Allauth
```

---

## 実践例：Todoリストアプリ📝

<details><summary>Todo Listアプリの実装例</summary>

```python
# views.py
from django.shortcuts import redirect, render
from .forms import TodoForm
from .models import Todo

def todo_list(request):
    todos = Todo.objects.all()
    form = TodoForm()
    return render(request, 'todo/list.html', {'todos': todos, 'form': form})

def todo_add(request):
    if request.method == 'POST':
        form = TodoForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('todo_list')
    return render(request, 'todo/add.html', {'form': form})
```

```html
<!-- templates/todo/list.html -->
{% extends 'base.html' %}
{% block content %}
  <h1>Todo List</h1>
  <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Add</button>
  </form>
  <ul>
  {% for todo in todos %}
    <li>{{ todo.title }} ({{ todo.done }})</li>
  {% endfor %}
  </ul>
{% endblock %}
```

</details>


## 最後に：業務委託のご相談を承ります

私は業務委託エンジニアとしてWEB制作やシステム開発を請け負っています。最新技術を活用したレスポンシブなWebサイト制作、インタラクティブなアプリケーション開発、API連携など幅広いご要望に対応可能です。

「課題解決に向けた即戦力が欲しい」「高品質なWeb制作を依頼したい」という方は、お気軽にご相談ください。一緒にビジネスの成長を目指しましょう！

👉 [ポートフォリオ](https://yushiyamamoto.vercel.app/)
🌳 [らくらくサイト](https://rakuraku-site.prodouga.com/)