Django 4 でデフォルトの User モデルを拡張し、カスタムユーザーモデルを作成する方法を解説します。
Django 4 では、デフォルトの User
モデル(django.contrib.auth.models.User
)をそのまま使用できますが、
プロジェクトによっては メールアドレスをログイン ID にしたい、追加のプロフィール情報を管理したい などの要件がある場合があります。
このような場合、カスタムユーザーモデル を作成し、拡張することが推奨されます。
本記事では、Django 4 で カスタムユーザーモデル を作成し、デフォルトの認証システムと連携する方法を解説します。
✅ カスタムユーザーモデルを使うメリット
username
ではなく email
でログインできるDjango では デフォルトの User
モデルを直接変更できないため、
最初からカスタムユーザーモデルを定義しておくのが推奨されています。
models.py
にカスタムユーザーモデルを定義します。
PYTHONfrom 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 でログイン できるように設定作成したカスタムユーザーモデルを Django に認識させるため、settings.py
に以下を追加します。
PYTHONAUTH_USER_MODEL = "base.CustomUser"
✅ ポイント
AUTH_USER_MODEL
で Django に カスタムユーザーモデルを使用する ことを明示モデルを作成したら、マイグレーションを実行してデータベースに反映します。
BASHpython manage.py makemigrations python manage.py migrate
✅ 注意点
User
モデルがある場合、変更が困難になるため 最初からカスタムユーザーモデルを使うのがベストカスタムユーザーを Django の管理画面で管理できるようにするため、admin.py
に登録します。
PYTHONfrom 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
で管理画面の表示をカスタマイズAbstractBaseUser
を継承して独自の認証システムを構築できるAUTH_USER_MODEL
を settings.py
に設定することでカスタムモデルを適用admin.py
に登録すれば、管理画面でユーザーを管理可能当サイトの情報は、一般的な参考情報として提供しております。
正確な情報の掲載に努めておりますが、その内容の正確性・完全性・最新性を保証するものではありません。
記事の内容をご利用の際は、ご自身の責任において判断し、必要に応じて専門家にご相談ください。
当サイトの情報の利用により生じたいかなる損害についても、一切の責任を負いかねますのでご了承ください。
※ 本ページでは、著作権法に基づき、適正な引用の範囲内でコンテンツを紹介しています。
オリジナルの情報は発信元をご確認ください。
もし問題がありましたら、こちら からお問い合わせください。