LoginSignup
3
3

Djangoにおけるカスタムユーザーの作り方

Posted at

1. Djangoにおけるユーザーの種類

DjangoはPythonを用いたWebフレームワークであり、デフォルトでユーザー認証に関する機能を備えています。大きく分けて次の2つのユーザーの種類がDjangoにはあります。

1.1. デフォルトのユーザーモデル

Djangoが提供するデフォルトのUserモデルは、django.contrib.auth.models内で定義されており、ユーザーネーム、パスワード、メールアドレス、名前(名前と姓)などの一般的なフィールドを含んでいます。

1.2. カスタムユーザーモデル

デフォルトのユーザーモデルは基本的なユーザー機能を備えていますが、すべてのプロジェクトのニーズを完全に満たすわけではありません。例えば、ユーザー名の代わりにメールアドレスを識別情報として使用したい場合や、ユーザー情報に追加のデータフィールド(社住所やプロフィール画像など)を含めたい場合などには、カスタムユーザーモデルが必要になります。

2. カスタムユーザーモデルにおける継承元

カスタムユーザーモデルを作成する際も、0から自分でユーザーモデルを作成するわけではありません。Djangoが標準で提供している抽象的なユーザーモデルを継承することで、標準の認証機能をカスタムユーザーでも利用することができます。継承元は次の2つから選択可能です。

2.1. AbstractUser

AbstractUserはDjangoが提供する抽象基底クラスで、デフォルトのUserモデルが持つ全てのフィールドとメソッド(ユーザーネーム、メールアドレス、パスワード、アクティブ状態など)を継承しています。AbstractUserは、デフォルトの認証フレームワークを大きく変更することなく、ユーザーモデルにいくつかのカスタムフィールドを追加したい場合や、特定のメソッドの動作をカスタマイズしたいが、基本的な構造は保持したい場合などに適しています。

2.2. AbstractBaseUser

AbstractBaseUserは、AbstractUserよりも柔軟な抽象基底クラスで、最も基本的な認証フレームワークのみを提供します。AbstractBaseUserは、携帯電話番号を主な認証手段として使用したい場合など、アプリケーションに特化した認証プロセスやユーザー属性を設計したい場合に適しています。

3. カスタムユーザーモデルの実装方法

具体的な実装方法を簡単に紹介します。

3.1. カスタムユーザーモデルの定義

models.py ファイルにカスタムユーザーモデルを定義します。CustomUser(AbstractUser)というように、AbstractUserを継承し、phone_numberやprofile_imagというフィールドを追加します。

from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    phone_number = models.CharField(max_length=15, unique=True, null=True)
    profile_image = models.ImageField(upload_to='profile_images/', null=True, blank=True)

3.2. 設定の更新

Djangoプロジェクトの settings.py で、AUTH_USER_MODEL をカスタムユーザーモデルに設定します。

AUTH_USER_MODEL = 'your_app_name.CustomUser'

3.3. ユーザーマネージャのカスタマイズ

AbstractBaseUser を継承している場合、カスタムユーザーマネージャも必要になります。下記の例では、ユーザーの作成と認証のロジックをカスタマイズします。

from django.contrib.auth.models import BaseUserManager

class CustomUserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        if not email:
            raise ValueError('The Email must be set')
        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_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)

まとめ

Djangoでは必要に応じて、カスタムユーザーを定義することで、標準で提供されている認証機能や管理機能を使用しながら、ユーザーに関する機能を拡張することができます。詳しくは公式ドキュメントをご覧ください。

3
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
3
3