Django: カスタムユーザーモデルの作成

Django 4 の実践(アプリ開発編)

日付:2025年2月18日

Django 4 でデフォルトの User モデルを拡張し、カスタムユーザーモデルを作成する方法を解説します。

目 次

はじめに

Django 4 では、デフォルトの User モデル(django.contrib.auth.models.User)をそのまま使用できますが、
プロジェクトによっては メールアドレスをログイン ID にしたい追加のプロフィール情報を管理したい などの要件がある場合があります。

このような場合、カスタムユーザーモデル を作成し、拡張することが推奨されます。

本記事では、Django 4 で カスタムユーザーモデル を作成し、デフォルトの認証システムと連携する方法を解説します。

1. なぜカスタムユーザーモデルが必要か?

カスタムユーザーモデルを使うメリット

  • username ではなく email でログインできる
  • プロフィール情報(アイコン、誕生日など)を追加できる
  • 拡張性が高く、将来の変更が容易

Django では デフォルトの User モデルを直接変更できないため
最初からカスタムユーザーモデルを定義しておくのが推奨されています。

2. カスタムユーザーモデルの作成

(1) モデルの作成

models.py にカスタムユーザーモデルを定義します。

PYTHON
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin from django.db import models # カスタムユーザーマネージャー # DjangoのデフォルトUserManagerを拡張し、カスタムユーザーモデルを管理 class CustomUserManager(BaseUserManager): # 通常のユーザーを作成するメソッド def create_user(self, email, password=None, **extra_fields): if not email: raise ValueError("メールアドレスは必須です") # メールアドレスが必須 email = self.normalize_email(email) # メールアドレスを正規化(小文字変換など) user = self.model(email=email, **extra_fields) # ユーザーインスタンスを作成 user.set_password(password) # パスワードをハッシュ化して保存 user.save(using=self._db) # データベースに保存 return user # スーパーユーザーを作成するメソッド def create_superuser(self, email, password=None, **extra_fields): extra_fields.setdefault("is_staff", True) # 管理画面にアクセス可能 extra_fields.setdefault("is_superuser", True) # すべての権限を持つ return self.create_user(email, password, **extra_fields) # 通常のユーザー作成メソッドを利用 # カスタムユーザーモデル # Django のデフォルト User モデルの代わりに独自のユーザーモデルを定義 class CustomUser(AbstractBaseUser, PermissionsMixin): email = models.EmailField(unique=True) # 一意のメールアドレスをユーザーIDとして使用 username = models.CharField(max_length=30, blank=True, null=True) # ユーザー名(省略可能) date_joined = models.DateTimeField(auto_now_add=True) # ユーザー登録日時 is_active = models.BooleanField(default=True) # アカウントの有効状態 is_staff = models.BooleanField(default=False) # Django 管理画面へのアクセス権限 objects = CustomUserManager() # カスタムマネージャーを適用 # 認証に使用するフィールドを email に設定 USERNAME_FIELD = "email" # 必須フィールド(email は USERNAME_FIELD に指定したため不要) REQUIRED_FIELDS = [] def __str__(self): return self.email # 管理画面などでの表示名

ポイント

  • AbstractBaseUser を継承し、独自の認証フィールド(email) を定義
  • BaseUserManager を継承した CustomUserManagerユーザー作成メソッド を定義
  • USERNAME_FIELD = "email" により、 email でログイン できるように設定

(2) settings.py の設定

作成したカスタムユーザーモデルを Django に認識させるため、settings.py に以下を追加します。

PYTHON
AUTH_USER_MODEL = "base.CustomUser"

ポイント

  • AUTH_USER_MODEL で Django に カスタムユーザーモデルを使用する ことを明示
  • この設定は 最初のマイグレーション前に行うことが推奨 される

3. マイグレーションの適用

モデルを作成したら、マイグレーションを実行してデータベースに反映します。

BASH
python manage.py makemigrations python manage.py migrate

注意点

  • 既存のデフォルト User モデルがある場合、変更が困難になるため 最初からカスタムユーザーモデルを使うのがベスト

4. 管理画面にカスタムユーザーモデルを登録

カスタムユーザーを Django の管理画面で管理できるようにするため、admin.py に登録します。

PYTHON
from django.contrib import admin from django.contrib.auth.admin import UserAdmin from .models import CustomUser class CustomUserAdmin(UserAdmin): model = CustomUser list_display = ('email', 'is_staff', 'is_active') ordering = ('email',) fieldsets = ( (None, {'fields': ('email', 'password')}), ('Permissions', {'fields': ('is_staff', 'is_active', 'is_superuser')}), ) add_fieldsets = ( (None, { 'classes': ('wide',), 'fields': ('email', 'password1', 'password2', 'is_staff', 'is_active') }), ) admin.site.register(CustomUser, CustomUserAdmin)

ポイント

  • UserAdmin を継承し、カスタムユーザーを管理画面に適用
  • list_display で管理画面の表示をカスタマイズ

5. まとめ

  • Django 4 では、カスタムユーザーモデルを最初から定義するのがベストプラクティス
  • AbstractBaseUser を継承して独自の認証システムを構築できる
  • AUTH_USER_MODELsettings.py に設定することでカスタムモデルを適用
  • admin.py に登録すれば、管理画面でユーザーを管理可能