[Django] Userをカスタマイズする

Custom User Modelの作成

AbstractBaseUserを継承したModelを作成します。このModelが標準のUser Modelの機能を満たすためには下記の事項を満たす必要があります。

  • Modelがユニークなキーを持っていること。
  • Modelがユニークなフィールド(username,email,,,etc)を持っていること。
  • get_full_name(),get_short_name()を実装していること。

AuthUser


class AuthUser(AbstractBaseUser, PermissionsMixin):
    def get_short_name(self):
        ...

    def get_full_name(self):
        ...

    username = models.CharField(unique=True, max_length=30)
    email = models.EmailField(unique=True)
    date_joined = models.DateTimeField(auto_now_add=True)
    is_active = models.BooleanField(default=True, null=False)
    is_staff = models.BooleanField(default=False, null=False)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']
    objects = AuthUserManager()

USERNAME_FIELDはそのユーザーのユニークなキーを記述します。ここではemailがユニークなフィールドとします。

REQUIRED_FIELDSはユーザーを作成するために必要なキーを記述します。

objects = AuthUserManager()標準のBaseUserManagerを使う代わりにAuthUserManagerを使うということをDjangoに知らせています。 これによって今後create_user,create_superuserのメソッドを呼ぶときにAuthUserManagerクラスのcreate_user,create_superuserのメソッドが呼ばれるようになります。

AuthUserManagerの実装は以下のようになります。

AuthUserManager

class AuthUserManager(BaseUserManager):
    def create_user(self, username, email, password):
        if not email:
            raise ValueError('Users must have an email')
        if not username:
            raise ValueError('Users must have an username')

        user = self.model(username=username, email=email, password=password)
        user.is_active = True
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, username, email, password):
        user = self.create_user(username=username, email=email, password=
        password)
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)

次に、DjangoにUserモデルではなく、AuthUserを使用するということをsettings.pyに以下のコードを記述して知らせてあげましょう。

AUTH_USER_MODEL = 'yourapp.AuthUser'

Done!

以上でUserを拡張したAuthUserを作成できました。
Enjoy coding!

Related Contents

Pickup Contents