search
LoginSignup
5
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Organization

DjangoでCustom User Modelを実装する

はじめに

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を追加しましょう。また末尾にデフォルトのユーザモデルの代わりにカスタムユーザモデルを使用する旨を記載します。

setting.py
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を追加しておきます。独自のフィールドを設定する場合にはこちらにフィールドを追加してください。

users/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    pass

Custom User Formsの作成

users/forms.pyを作成し、以下のコードを追加します。

users/form.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に以下のコードを追加します。

users/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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
5
Help us understand the problem. What are the problem?