ユーザープロファイル管理の基本
なぜユーザープロファイル管理が必要なのか?
Webアプリケーションでは、ユーザーごとに異なる情報を管理することが一般的です。たとえば、
- 名前やメールアドレス
- アバター画像
- ユーザーの設定情報
これらの情報を適切に管理するために、ユーザープロファイルを導入する必要があります。Djangoでは、デフォルトの認証システムに加えて、ユーザープロファイルを簡単に拡張できる仕組みが用意されています。
ユーザープロファイルモデルの作成
カスタムユーザープロファイルモデルの基本
Djangoのデフォルトユーザーモデル(django.contrib.auth.models.User
)を拡張して、カスタムフィールドを追加する方法を説明します。
- モデルの定義 カスタムユーザープロファイルには、標準ユーザー情報に加えて任意の情報を追加できます。
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
: プロファイル画像をアップロードするフィールド。
- マイグレーションの適用 モデルを定義したら、データベースに反映するためにマイグレーションを行います。
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でのユーザープロファイル管理は、標準の認証システムを拡張することで簡単に実装できます。プロファイル情報の作成から編集、表示までの流れを理解すれば、ユーザーごとの設定やカスタマイズが可能なアプリケーションを構築することができます。