Django

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

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

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

https://docs.djangoproject.com/en/3.0/ref/contrib/auth/

カスタムユーザーモデルを使えば、デフォルトの要素に加えて「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'

[alert title=”注意”]末尾への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'.

[/alert]

次に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

[alert title=”注意”]migrate実行時に以下のようなエラーが出た場合は、一度db.sqlite3を削除してからもう一度migrateを実行してください。

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

[/alert]

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

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

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

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 をちゃんと勉強するなら

Djangoは無料で学べます。もちろんネット上のチュートリアルで勉強するのも無料ですが、書籍で体系的に学びたい、という人も多いでしょう。

書籍で勉強したいけどお金はあまり払いたくないなぁ、という方。安心してください。無料です。

Kindle Unlimited で無料で読めます。 Unlimited は10万冊以上の本が普通に無料で読める上に、最初の30日は体験期間で、解約すればお金がかかりません。

技術書は無料で読んでしまいましょう。サクッと読んで、解約すれば大丈夫です。ぜひ無料の技術書でDjangoの基礎を押さえてください。