Djangoで基本的なブログ機能を作る

Djangoサイトにブログ機能を追加する方法について下記に記載していきます。

### 1. プロジェクトのセットアップ

まず、Djangoプロジェクトを作成して、必要なアプリケーションを追加します。アプリ名は「blog」とします。

```sh
django-admin startproject mysite
cd mysite
django-admin startapp blog
```

### 2. `settings.py`の編集

`mysite/settings.py`を開いて、`INSTALLED_APPS`リストに`blog`アプリを追加します。

```python
# settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',  # ここに追加
]
```


### 3. モデルの作成

ブログ記事を保存するためのモデルを`blog/models.py`に追加します。

```python
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    created_at = models.DateTimeField(default=timezone.now)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title
```

### 4. モデルのマイグレーション

データベースにモデルを反映させます。

```sh
python manage.py makemigrations
python manage.py migrate
```

### 5. 管理画面の設定

ブログ記事を管理画面から操作できるようにするため、`blog/admin.py`にモデルを登録します。

```python
from django.contrib import admin
from .models import Post

admin.site.register(Post)
```

### 6. 管理画面の作成

管理画面で操作するために、スーパーユーザーを作成します。

```sh
python manage.py createsuperuser
```

そして、管理画面にアクセスできるように、`mysite/urls.py`を編集します。

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

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

### 7. ビューとテンプレートの作成

ブログの投稿を表示するビューとテンプレートを作成します。

#### ビューの作成

`blog/views.py`に以下のビューを追加します。

```python
from django.shortcuts import render
from .models import Post

def post_list(request):
    posts = Post.objects.all().order_by('-created_at')
    return render(request, 'blog/post_list.html', {'posts': posts})

def post_detail(request, pk):
    post = Post.objects.get(pk=pk)
    return render(request, 'blog/post_detail.html', {'post': post})
```

#### URLパターンの設定

`blog/urls.py`を作成し、URLパターンを設定します。

```python
from django.urls import path
from . import views

urlpatterns = [
    path('', views.post_list, name='post_list'),
    path('post/<int:pk>/', views.post_detail, name='post_detail'),
]
```

#### `settings.py`の編集

`settings.py`ファイルを開き、`TEMPLATES`設定の`'DIRS'`オプションにテンプレートディレクトリのパスを追加します。

```python
import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

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',
            ],
        },
    },
]
```

#### テンプレートディレクトリの作成

プロジェクトのルートディレクトリに`templates`ディレクトリを作成し、その中に`blog`ディレクトリを作成します。

```sh
cd mysite
mkdir -p templates/blog
```

これで、`settings.py`の`TEMPLATES`設定にテンプレートディレクトリのパスを追加し、テンプレートファイルを適切な場所に配置することで、Djangoプロジェクトでテンプレートを正しく読み込むことができます。

#### テンプレートの作成

`templates/blog`ディレクトリを作成し、`post_list.html`と`post_detail.html`を追加します。

`post_list.html`:

```html
<!DOCTYPE html>
<html>
<head>
    <title>Blog</title>
</head>
<body>
    <h1>Blog</h1>
    <ul>
        {% for post in posts %}
            <li>
                <a href="{% url 'post_detail' post.pk %}">{{ post.title }}</a>
                <p>{{ post.created_at }}</p>
            </li>
        {% endfor %}
    </ul>
</body>
</html>
```

`post_detail.html`:

```html
<!DOCTYPE html>
<html>
<head>
    <title>{{ post.title }}</title>
</head>
<body>
    <h1>{{ post.title }}</h1>
    <p>{{ post.created_at }}</p>
    <div>{{ post.content }}</div>
    <a href="{% url 'post_list' %}">Back to Blog</a>
</body>
</html>
```

### 8. サーバーの起動と確認

Django開発サーバーを起動して、ブログ機能が正常に動作するか確認します。

```sh
python manage.py runserver
```

ブラウザで`http://127.0.0.1:8000/admin`にアクセスし、スーパーユーザーでログインしてブログ記事を追加・編集します。追加した記事が`http://127.0.0.1:8000/blog/`に表示されるか確認します。

これで、Djangoサイトに基本的なブログ機能を追加し、ブログ記事を更新できるようになります。