Django|カスタムユーザーモデルの作り方(AbstractUserを使ったサンプル)

この記事ではユーザーモデルをカスタマイズする方法を紹介します。
デフォルトの要素に加えて、任意の登録情報を追加することができます。

デフォルトのユーザーモデルが持つ要素にはusernameやfirst_name,email, passwordなどがあります。

参考 django.contrib.auth¶django Documentation

カスタムユーザーモデルを使えば、デフォルトの要素に加えて「age(年齢)」だったり、「favorite_celeblity(好きな芸能人)」などの要素をアレンジして加えることができます。

作業の手順は以下のとおりです。

  1. カスタムユーザー用のアプリを作る(usersという名前で作る)
  2. settings.pyを編集する
  3. users/models.pyにカスタムユーザーモデルを定義する
  4. users/forms.pyでカスタムユーザーモデルを使った登録フォームを定義する
  5. users/admin.pyを編集して管理者画面でカスタム要素を表示できるようにする
  6. カスタムユーザを使うビューでフォームを読み込む

それでは、順番に作業を行っていきましょう。

カスタムユーザーを作るためのusersアプリケーションを作ります。

python manage.py startapp users

この時点ではまだマイグレーションは実行しないでください。

settings.pyのINSTALLED_APPSを編集し、上記で追加したusers.apps.UsersConfigを読み込むように設定します。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog.apps.BlogConfig',
    'accounts.apps.AccountsConfig',
    'users.apps.UsersConfig',
]

# 末尾に追記
AUTH_USER_MODEL = 'users.CustomUser'
注意
末尾へのAUTH_USER_MODELの追記を忘れると以下のようなエラーが出ます。


SystemCheckError: System check identified some issues:

ERRORS:
auth.User.groups: (fields.E304) Reverse accessor for 'User.groups' clashes with reverse accessor for 'CustomUser.groups'.
        HINT: Add or change a related_name argument to the definition for 'User.groups' or 'CustomUser.groups'.
auth.User.user_permissions: (fields.E304) Reverse accessor for 'User.user_permissions' clashes with reverse accessor for 'CustomUser.user_permissions'.

次にusers/models.pyを編集します。
デフォルトのユーザーモデルに「年齢」と「好きな芸能人」を追加します。

from django.contrib.auth.models import AbstractUser
from django.db import models

# Create your models here.
class CustomUser(AbstractUser):
  # 年齢
  age = models.PositiveIntegerField(null=True, blank=True)

  # 好きな芸能人
  favorite_celebrity = models.CharField(null=True, blank=True)

ユーザー作成用のフォームを作ります。
users/forms.pyというファイルを作成し、以下のようにコードを書いてください。

from django import forms
from django.contrib.auth.forms import UserCreationForm, UserChangeForm

from .models import CustomUser

class CustomUserCreationForm(UserCreationForm):
  class Meta(UserCreationForm):
    model = CustomUser
    fields = UserCreationForm.Meta.fields + ('age','favorite_celebrity')

class CustomUserChangeForm(UserChangeForm):
  class Meta:
    model = CustomUser
    fields = UserChangeForm.Meta.fields

最後にusers/admin.pyを以下のように編集します。

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin

from .forms import CustomUserCreationForm, CustomUserChangeForm

from .models import CustomUser

# Register your models here.
class CustomUserAdmin(UserAdmin):
  add_form = CustomUserCreationForm
  form = CustomUserChangeForm
  model = CustomUser
  list_display = ['email', 'username', 'age', 'favorite_celebrity',]

admin.site.register(CustomUser, CustomUserAdmin)

makemigrationsとmigrateを実行します。

% python manage.py makemigrations users
% python manage.py migrate
注意
migrate実行時に以下のようなエラーが出た場合は、一度db.sqlite3を削除してからもう一度migrateを実行してください。

django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency users.0001_initial on database 'default'.

これでカスタムユーザーフォームを使う準備は完了です。

管理者画面で見てみると、ユーザーフォームがカスタマイズできていることがわかります。

別のアプリケーションからカスタマイズしたユーザーフォームを使う場合も見てみます。

accounts/views.pyを以下のように編集しました。

from django.urls import reverse_lazy
from django.contrib.auth.forms import UserCreationForm
from django.views import generic
from users.forms import CustomUserCreationForm

# Create your views here.
class SignUpView(generic.CreateView):
  #form_class = UserCreationForm
  form_class = CustomUserCreationForm
  success_url = reverse_lazy('login')
  template_name = 'signup.html'

すると、追加したパラメータが表示できていることがわかります。

上のユーザー登録フォームを使うサンプルは以下の記事で詳しく紹介しています。

Djangoでログイン・ログアウト・ユーザー登録を行う

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です