【Django入門23】ユーザープロファイルの管理|カスタマイズされたプロフィール機能を構築

ユーザープロファイル管理の基本

なぜユーザープロファイル管理が必要なのか?

Webアプリケーションでは、ユーザーごとに異なる情報を管理することが一般的です。たとえば、

  • 名前やメールアドレス
  • アバター画像
  • ユーザーの設定情報

これらの情報を適切に管理するために、ユーザープロファイルを導入する必要があります。Djangoでは、デフォルトの認証システムに加えて、ユーザープロファイルを簡単に拡張できる仕組みが用意されています。

ユーザープロファイルモデルの作成

カスタムユーザープロファイルモデルの基本

Djangoのデフォルトユーザーモデル(django.contrib.auth.models.User)を拡張して、カスタムフィールドを追加する方法を説明します。

  1. モデルの定義 カスタムユーザープロファイルには、標準ユーザー情報に加えて任意の情報を追加できます。

models.py:

from django.db import models
from django.contrib.auth.models import User

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(blank=True, null=True)  # 自己紹介
    avatar = models.ImageField(upload_to='avatars/', blank=True, null=True)  # プロファイル画像
    birth_date = models.DateField(blank=True, null=True)  # 生年月日

    def __str__(self):
        return self.user.username
  • OneToOneField: 各ユーザーに1つのプロファイルが対応する。
  • bio: 自己紹介用のテキストフィールド。
  • avatar: プロファイル画像をアップロードするフィールド。
  1. マイグレーションの適用 モデルを定義したら、データベースに反映するためにマイグレーションを行います。
python manage.py makemigrations
python manage.py migrate

プロファイル作成と更新の処理

ユーザープロファイル作成の自動化

新しいユーザーが作成されたときに自動的にUserProfileを作成するためには、シグナルを利用します。

signals.py:

from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
from .models import UserProfile

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.userprofile.save()
  • post_save: ユーザーが保存された後にシグナルが発火します。
  • create_user_profile: 新しいユーザーが作成されたときに対応するUserProfileを自動作成します。

apps.pyでシグナルを登録

apps.py:

from django.apps import AppConfig

class MyAppConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'myapp'

    def ready(self):
        import myapp.signals

プロファイル編集フォームの作成

フォームの定義

ユーザープロファイルを編集するために、ModelFormを使用します。

forms.py:

from django import forms
from .models import UserProfile

class UserProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ['bio', 'avatar', 'birth_date']
  • ModelForm: モデルに基づいたフォームを簡単に作成できる。

ビューの作成

ユーザーが自分のプロファイル情報を編集できるビューを作成します。

views.py:

from django.shortcuts import render, redirect
from .forms import UserProfileForm
from django.contrib.auth.decorators import login_required

@login_required
def edit_profile_view(request):
    profile = request.user.userprofile
    if request.method == 'POST':
        form = UserProfileForm(request.POST, request.FILES, instance=profile)
        if form.is_valid():
            form.save()
            return redirect('profile_view')
    else:
        form = UserProfileForm(instance=profile)
    return render(request, 'edit_profile.html', {'form': form})
  • login_required: ユーザーがログインしていないとアクセスできないようにする。
  • instance=profile: 既存のプロファイル情報をフォームに表示します。

プロファイル編集テンプレートの作成

templates/edit_profile.html:

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>プロファイル編集</title>
</head>
<body>
    <h1>プロファイル編集</h1>
    <form method="POST" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">保存する</button>
    </form>
</body>
</html>
  • enctype="multipart/form-data": ファイルを含むフォームを送信する場合に必要です。
  • csrf_token: CSRF保護のために必須です。

プロファイルの表示

ビューの作成

ユーザーのプロファイル情報を表示するためのビューを作成します。

views.py:

from django.shortcuts import render
from django.contrib.auth.decorators import login_required

@login_required
def profile_view(request):
    profile = request.user.userprofile
    return render(request, 'profile.html', {'profile': profile})

プロファイル表示用テンプレートの作成

templates/profile.html:

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>プロファイル情報</title>
</head>
<body>
    <h1>{{ profile.user.username }} のプロファイル</h1>
    <p>自己紹介: {{ profile.bio }}</p>
    <p>生年月日: {{ profile.birth_date }}</p>
    {% if profile.avatar %}
        <img src="{{ profile.avatar.url }}" alt="プロファイル画像">
    {% else %}
        <p>プロファイル画像が設定されていません。</p>
    {% endif %}
    <a href="/edit-profile/">プロファイルを編集する</a>
</body>
</html>

URLの設定

urls.py:

from django.urls import path
from .views import edit_profile_view, profile_view

urlpatterns = [
    path('profile/', profile_view, name='profile_view'),
    path('edit-profile/', edit_profile_view, name='edit_profile'),
]

まとめ

Djangoでのユーザープロファイル管理は、標準の認証システムを拡張することで簡単に実装できます。プロファイル情報の作成から編集、表示までの流れを理解すれば、ユーザーごとの設定やカスタマイズが可能なアプリケーションを構築することができます。