6
7

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 1 year has passed since last update.

【Django】カスタムユーザーの作成

Last updated at Posted at 2023-07-04

カスタムユーザーとは

Djangoにおけるカスタムユーザーとはwebアプリ開発者が独自に作成するユーザのモデルのことです。Djangoには標準でUserモデルが用意されていますが、こちらのモデルを使うことはDjango公式でも推奨されていません。
カスタムユーザを定義することで標準のUserモデルでは定義されていないfieldを作成することができます。

Userモデルについて

それでは標準で用意されているUserモデルではどのようなフィールドが与えられているか下にまとめてみました。(一部)

field 補足
username 必須。 150文字以下。
ユーザー名には英数字が含まれている場合があります
first_name オプション(blank=True)。150 文字以下。
last_name オプション(blank=True)。150 文字以下。
email オプション(blank=True)。メール
password 必須。パスワードのハッシュとメタデータ。

一部ですが標準のUserモデルは上記のようなfieldに対して値を設定できます。
webアプリケーションを作成する際にユーザーの情報としてもっとたくさんのfieldを定義したい!!といったときにカスタムユーザを定義する必要があります。
というか、アプリ作成をするにあたってカスタムユーザーの定義は必須です。前述の通り、Djangoの公式でもUserモデルは非推奨とされており、その理由はUserモデルで一度定義していまうと(migrationすると)もうカスタムユーザーにはできないからなんです。
要はあとからアプリの拡張をしたいと思ってユーザのfieldに追加したい項目ができても変更ができないということです。
参考:https://docs.djangoproject.com/en/4.2/ref/contrib/auth/

カスタムユーザ作成方法

実際にカスタムユーザーを定義していきますが大きな手順としては以下の4つです。

  1. カスタムユーザの定義
  2. カスタムユーザーのカスタマイズ
  3. ユーザ管理モデルとして適用させる
  4. 管理画面でカスタムユーザを管理する

1.カスタムユーザの定義

そもそも標準で準備されているUserモデルはどのように定義されているかというと、AbstractUserというクラスを継承して定義されています。つまり、AbstractUserを継承し、CustomUserを再定義すれば簡単にカスタムユーザを創ることができます。このAbstractUserは権限管理やバリデーションなどの機能を持っていますので、カスタムユーザーでの認証も簡単にすることができます。

カスタムユーザーの定義
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    pass

実際にカスタムユーザーを作成しました。AbstractUserを継承してくるだけで処理を終えているのでこの状態のカスタムユーザーは実質Userモデルを使用しているのと変わりありません。(しかし、こうしておくことで最初はUserモデルと同等での使用でもあとからカスタマイズが可能になる。)

2.カスタムユーザーのカスタマイズ

それでは自身が欲しいfieldをカスタムユーザに追加していきましょう。
AbstractUserを継承していることから、上の表で示したUserモデルが持っているfieldはすでに持っているため、追加したいfieldのみ記述すればよいです。
今回は身長と体重をユーザ情報をとして持っておきたいので、weightとheightを定義することにします。

カスタマイズ
from django.db import models
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    height = models.FloatField()
    weight = models.FloatField()

    REQUIRED_FIELDS = ["height", "weight"]

また、ここでREQUIRED_FIELDSには追加したfieldをリスト形式で代入しています。これはコマンドでのユーザ作成createsuperuserコマンドでのときに入力必須フィールドだと知らせるための記述です。

3.ユーザ管理モデルとして適用させる

次に認証に使用するユーザーモデルをカスタムユーザに変更していきます。
現状ではUserモデルが認証に使われる設定になっています。そのためカスタムユーザを作成し、ユーザを作ろうとしても、認証がUserモデルのため全く意味をなさないことになります。
そのため、認証に使うモデルの設定をsettings.pyファイル内で行いましょう。

AUTH_USER_MODEL = 'アプリ名.カスタムユーザーのModel名'

#今回だと
AUTH_USER_MODEL = 'アプリ名.CustomUser'

ここまで来ましたら、makemigration→migrateしてもらえばモデルの定義ができています。

4.管理画面でカスタムユーザを管理する

カスタムユーザーの定義が済み、webアプリ内でのユーザー作成にカスタムユーザを適用させ認証時使用モデルも設定したため、これで終わりかと思いきや、このままではDjangoで用意されている管理画面にカスタムユーザーが適用されていません。(localhost:ポート/admin画面)
管理画面でカスタムユーザを適用させるためには、admin.pyファイルに以下の記述を加えます。

admin.py
from django.contrib import admin
from django.contrib.auth import get_user_model

CustomUser = get_user_model()

admin.site.register(CustomUser)

以上でカスタムユーザーの定義から、認証、管理に及ぶ設定の変更が完了です。

おわりに

Djangoでwebアプリを作成するとこのカスタムユーザを作ることが必須であるため、忘れないように記事に残しておきました。カスタムユーザー定義内でメソッドの定義やオーバーライドもできたりするのでそちらも活用できると非常に読みやすいコードになりそう!
今後もDjangoでのwebアプリ開発がんばっていきましょ~~~

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?