#はじめに
DjangoでCustom User Modelを設定します。
本記事はDjangoアプリをDocker上に構築しAWS Fargateにデプロイするプロジェクトの一部です。
#Custom User Modelを使う理由
Djangoにはデフォルトでユーザのモデルが設定されています。しかし、実際にアプリを作成すると、自分の作成したアプリに合わせてユーザモデルを変更したくなる時が必ずやってきます。ある程度コーディングが進んだ段階でユーザモデルの修正を行うのはとても難しい為、プロジェクトの最初からCustom User Modelを設定することが推奨されています。
#Custom User Modelの実装について
Custom User Modelを実装するには「AbstractUser」クラスまたは「AbstractBaseUser」クラスを利用します。「AbstractUser」クラスはデフォルトのユーザフィールドや認証を拡張する方法でありシンプルに実装が可能です。「AbstractBaseUser」クラスを使う方法はコーディング量が増えますが、より細かくカスタマイズができます。
今回は「AbstractUser」を使用し実装していきます。自身が開発に携わったプロジェクトでも「AbstractUser」を使用してユーザモデルをカスタマイズしました。一般的なユーザ管理をするのであれば「AbstractUser」でも十分対応できます。
#準備
Docker+DjangoでPostgreSQLを使う で作成したプロジェクトにCustom User Modelを実装します。
#usersアプリの追加
まずはstartappコマンドでカスタムユーザを管理するusersアプリを作成します。その後setting.pyにCustom User Model関連のコードを追加します。
docker-compose exec web python manage.py startapp users
setting.pyに作成したusersを追加しましょう。また末尾にデフォルトのユーザモデルの代わりにカスタムユーザモデルを使用する旨を記載します。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# Local
'users.apps.UsersConfig', #追加
]
...
AUTH_USER_MODEL = 'users.CustomUser' # 追加
#modelへCustomUserを追加
models.pyにCustomUserクラスを作成します。今回はデフォルトのユーザモデルからフィールドの追加はしないので直下にはpassを追加しておきます。独自のフィールドを設定する場合にはこちらにフィールドを追加してください。
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
pass
#Custom User Formsの作成
users/forms.pyを作成し、以下のコードを追加します。
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm):
model = get_user_model()
fields = ('email', 'username',)
class CustomUserChangeForm(UserChangeForm):
class Meta(UserChangeForm):
model = get_user_model()
fields = ('email', 'username',)
#Custom User Adminの設定
admin.pyに以下のコードを追加します。
from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin
from .forms import CustomUserCreationForm, CustomUserChangeForm
CustomUser = get_user_model()
class CustomUserAdmin(UserAdmin):
add_form = CustomUserCreationForm
form = CustomUserChangeForm
model = CustomUser
list_display = ['email', 'username',]
admin.site.register(CustomUser, CustomUserAdmin)
これで設定は完了です。最後にマイグレーションを行いましょう。
docker-compose exec web python manage.py makemigrations users
docker-compose exec web python manage.py migrate