前置き
(Django2.01, Python3.6.4)
デフォルトだと username
と password
なので、email
と password
でログインできるように変更してみる。
プロジェクト作成
$ django-admin startproject core
$ mv core sample_email_login
$ cd sample_email_login
アプリ作成
$ python manage.py startapp account
account/models.py
django.contrib.auth.models
のUserManagerとAbstractUser を継承して利用。コピペして必要な箇所を削除・修正するのがラクかも。
(今回は簡単に AbstractUser
使ってるけど実際開発で使う場合は AbastractBaseUser を継承して User 作ると思う。)
account/models.py
from django.contrib.auth.models import AbstractUser, UserManager
from django.db import models
from django.utils.translation import gettext_lazy as _
class UserManager(UserManager):
def _create_user(self, email, password, **extra_fields):
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_user(self, email, password=None, **extra_fields):
extra_fields.setdefault('is_staff', False)
extra_fields.setdefault('is_superuser', False)
return self._create_user(email, password, **extra_fields)
def create_superuser(self, email, password, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self._create_user(email, password, **extra_fields)
class User(AbstractUser):
username = models.CharField(_('username'), max_length=150, blank=True)
email = models.EmailField(_('email address'), unique=True)
objects = UserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
- UserManager を修正しないと
manage.py createsuperuser
でエラーになる - UserManager から
username
を削除 - AbstractUser から
username
の必須を外してemail
を必須かつユニークに
account/admin.py
account/admin.py
from django.contrib import admin
from .models import User
admin.site.register(User)
core/settings.py
INSTALLED_APPS = [
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
+
+ 'account',
]
STATIC_URL = '/static/'
+
+AUTH_USER_MODEL = 'account.User'
マイグレーション
$ python manage.py makemigrations account
$ python manage.py migrate
管理者作成
$ python manage.py createsuperuser
動作確認
$ python manage.py runserver
Username
ではなく Email
になっている
感想
- もっとシンプルなやり方あるのかな?
-
AbastractBaseUser
を継承するとなったら面倒くさそうかも - Djangoはコード追いやすくて良い感じ