0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Django】メールログイン用Userモデルをサクッと定義する

Last updated at Posted at 2021-11-24

備忘録です。

Djangoはデフォルトだとusernamepasswordでの認証となっているため、emailpasswordで認証できるようにユーザーモデルをサクッと実装してみる。

1. accountsアプリを作成

まずは認証用のアプリ(accounts)を作成して、settings.pyに登録する。ここまでは、至って普通。

python manage.py startapp accounts
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'accounts',
]

2. カスタムユーザーとカスタムマネージャーの作成

ここからが本番。accountsのmodels.pyに定義していく。

django.contrib.auth.models.AbstractBaseUserを継承したカスタムユーザーのクラスを作成し、必要なフィールド情報を記入する。このとき、PermissionsMixinも一緒に継承する(☆1)。
パスワードのフィールドはAbstractBaseUserに存在しているので定義する必要はない。PermissionsMixinにスーパーユーザーかどうかを識別するis_superuserというフィールドが入っているので、定義する必要はない。

USERNAME_FIELD = 'email'とすることで、メールアドレスでこのテーブルのレコードを一意に識別することができる、つまり**メールアドレスでのログインが可能となる**(☆2)。

カスタムマネージャー(UserManager)は、django.contrib.auth.models.BaseUserManagerを継承して作成し、create_usercreate_superuserメソッドを追加して、ユーザ作成時、スーパーユーザー作成時の処理を追加する(☆3)。

accounts/models.py
from django.db import models
from django.contrib.auth.models import (
    BaseUserManager, AbstractBaseUser, PermissionsMixin
)


class UserManager(BaseUserManager): # ☆3

    def create_user(self, username, email, password=None):
        if not email:
            raise ValueError('Enter Email!')
        user = self.model(
            username=username,
            email=email
        )
        user.set_password(password)
        user.save(using=self._db)
        return user
    
    def create_superuser(self, username, email, password=None):
        user = self.model(
            username=username,
            email=email,
        )
        user.set_password(password)
        user.is_staff = True
        user.is_active = True
        user.is_superuser = True
        user.save(using=self._db)
        return user


class User(AbstractBaseUser, PermissionsMixin): # ☆1
    
    # 使いたいFieldを追加
    username = models.CharField(max_length=255)
    email = models.EmailField(max_length=255, unique=True)
    is_active = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = 'email' # ☆2 このテーブルのレコードを一意に識別
    REQUIRED_FIELDS = ['username'] # スーパーユーザ作成時に入力する

    class Meta:
        db_table = 'users'
    
    def __str__(self):
        return self.email

3. settings.pyに追記

settings.pyに、カスタムユーザーモデルを以下のように追記する。

settings.py
AUTH_USER_MODEL = 'accounts.User'

4. マイグレーション

$ python manage.py makemigrations accounts
$ python manage.py migrate

5. 管理者の作成

$ python manage.py createsuperuser

6. 管理サイトを開いて見る

図1.png

こんな感じで、メールアドレスとパスワードでの認証システムを実装することができる。

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?