KAMEYA_WORKS
accounts/models.py
を以下のように修正して、nickname をログインIDとして使用するようにします。
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
from django.db import models
class CustomUserManager(BaseUserManager):
def create_user(self, nickname, password=None, **extra_fields):
if not nickname:
raise ValueError('ニックネームは必須です')
user = self.model(nickname=nickname, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, nickname, password=None, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
return self.create_user(nickname, password, **extra_fields)
class CustomUser(AbstractBaseUser, PermissionsMixin):
nickname = models.CharField(max_length=30, unique=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
date_joined = models.DateTimeField(auto_now_add=True)
objects = CustomUserManager()
USERNAME_FIELD = 'nickname'
REQUIRED_FIELDS = []
def __str__(self):
return self.nickname
重要:USERNAME_FIELD = 'nickname'
を設定することで、ログイン時に nickname
を使用するようになります。
プロジェクトの settings.py
に以下の設定があることを確認します。
AUTH_USER_MODEL = 'accounts.CustomUser'
初回のみ必要です(既にユーザーモデルを定義済みの場合、再作成が必要になる可能性があります)。
python manage.py makemigrations
python manage.py migrate
コンソールで以下を実行して、ニックネームでログインできるスーパーユーザーを作成します。
python manage.py createsuperuser
Nickname:
が入力項目になります。
accounts/admin.py
を以下のように修正して、管理画面で nickname
によるログインができるようにします。
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import CustomUser
class CustomUserAdmin(UserAdmin):
model = CustomUser
list_display = ('nickname', 'is_staff', 'is_superuser')
ordering = ('nickname',)
search_fields = ('nickname',)
fieldsets = (
(None, {'fields': ('nickname', 'password')}),
('Permissions', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}),
('Important dates', {'fields': ('last_login',)}),
)
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('nickname', 'password1', 'password2'),
}),
)
admin.site.register(CustomUser, CustomUserAdmin)
python manage.py runserver
Djangoの認証において ニックネームをログインIDとして使う設定が完了しました。
この方法は、ユーザーが自由な名前でログインできる SNS やコミュニティ系サービスに適しています。