Djangoでブログを作る!投稿・編集・削除機能を実装する方法【簡単チュートリアル】

以下は、Djangoを使用してブログアプリを作成する手順です。このアプリでは、投稿の作成・編集・削除を行える基本機能を実装します。その後、ユーザー認証とコメント機能を追加する方法を説明します。

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

まず、Django プロジェクトとアプリケーションを作成します。

必要な環境を準備

# 必要なら仮想環境を作成
python -m venv myenv
source myenv/bin/activate  # Windowsでは `myenv\Scripts\activate`

# Django をインストール
pip install django

プロジェクトを作成

django-admin startproject blog_project
cd blog_project
python manage.py startapp blog

settings.py にアプリを登録します:

# blog_project/settings.py
INSTALLED_APPS = [
    ...
    'blog',
]

2. モデルの定義

ブログ投稿のモデルを定義します。

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

class Post(models.Model):
    title = models.CharField(max_length=100)  # 投稿タイトル
    content = models.TextField()  # 投稿内容
    created_at = models.DateTimeField(auto_now_add=True)  # 作成日時
    updated_at = models.DateTimeField(auto_now=True)  # 更新日時

    def __str__(self):
        return self.title

データベースをマイグレーション

python manage.py makemigrations
python manage.py migrate

3. 管理画面のセットアップ

Django の管理画面から投稿を操作可能にします。

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

admin.site.register(Post)

管理ユーザーを作成:

python manage.py createsuperuser

サーバーを起動して、管理画面にアクセス:

python manage.py runserver
# ブラウザで http://127.0.0.1:8000/admin/

4. ビューと URL の作成

CRUD 操作を実装するためのビューと URL を作成します。

URL の設定

# blog/urls.py
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'),
    path('post/new/', views.post_create, name='post_create'),
    path('post/<int:pk>/edit/', views.post_edit, name='post_edit'),
    path('post/<int:pk>/delete/', views.post_delete, name='post_delete'),
]

プロジェクトの urls.py にも追加:

# blog_project/urls.py
from django.contrib import admin
from django.urls import path, include

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

ビューの作成

# blog/views.py
from django.shortcuts import render, get_object_or_404, redirect
from .models import Post
from .forms import PostForm

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

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

def post_create(request):
    if request.method == "POST":
        form = PostForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('post_list')
    else:
        form = PostForm()
    return render(request, 'blog/post_form.html', {'form': form})

def post_edit(request, pk):
    post = get_object_or_404(Post, pk=pk)
    if request.method == "POST":
        form = PostForm(request.POST, instance=post)
        if form.is_valid():
            form.save()
            return redirect('post_list')
    else:
        form = PostForm(instance=post)
    return render(request, 'blog/post_form.html', {'form': form})

def post_delete(request, pk):
    post = get_object_or_404(Post, pk=pk)
    if request.method == "POST":
        post.delete()
        return redirect('post_list')
    return render(request, 'blog/post_confirm_delete.html', {'post': post})

5. フォームの作成

Djangoのフォームを作成します。

# blog/forms.py
from django import forms
from .models import Post

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['title', 'content']

6. テンプレートの作成

templates/blog/ フォルダを作成し、以下のテンプレートを配置します。

post_list.html

<h1>ブログ一覧</h1>
<a href="{% url 'post_create' %}">新しい投稿を作成</a>
<ul>
    {% for post in posts %}
        <li>
            <a href="{% url 'post_detail' post.pk %}">{{ post.title }}</a>
        </li>
    {% endfor %}
</ul>

post_detail.html

<h1>{{ post.title }}</h1>
<p>{{ post.content }}</p>
<a href="{% url 'post_edit' post.pk %}">編集</a>
<form action="{% url 'post_delete' post.pk %}" method="post">
    {% csrf_token %}
    <button type="submit">削除</button>
</form>
<a href="{% url 'post_list' %}">戻る</a>

post_form.html

<h1>投稿フォーム</h1>
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">保存</button>
</form>
<a href="{% url 'post_list' %}">戻る</a>

これで基本的なブログアプリが完成です!