この記事ではユーザーモデルをカスタマイズする方法を紹介します。
デフォルトの要素に加えて、任意の登録情報を追加することができます。
デフォルトのユーザーモデルが持つ要素にはusernameやfirst_name,email, passwordなどがあります。
参考 django.contrib.auth¶django Documentationカスタムユーザーモデルを使えば、デフォルトの要素に加えて「age(年齢)」だったり、「favorite_celeblity(好きな芸能人)」などの要素をアレンジして加えることができます。
作業の手順は以下のとおりです。
- カスタムユーザー用のアプリを作る(usersという名前で作る)
- settings.pyを編集する
- users/models.pyにカスタムユーザーモデルを定義する
- users/forms.pyでカスタムユーザーモデルを使った登録フォームを定義する
- users/admin.pyを編集して管理者画面でカスタム要素を表示できるようにする
- カスタムユーザを使うビューでフォームを読み込む
それでは、順番に作業を行っていきましょう。
カスタムユーザーを作るための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
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'
すると、追加したパラメータが表示できていることがわかります。
上のユーザー登録フォームを使うサンプルは以下の記事で詳しく紹介しています。

コメントを残す