カスタムユーザーとは
Djangoにおけるカスタムユーザーとはwebアプリ開発者が独自に作成するユーザのモデルのことです。Djangoには標準でUserモデルが用意されていますが、こちらのモデルを使うことはDjango公式でも推奨されていません。
カスタムユーザを定義することで標準のUserモデルでは定義されていないfieldを作成することができます。
Userモデルについて
それでは標準で用意されているUserモデルではどのようなフィールドが与えられているか下にまとめてみました。(一部)
field | 補足 |
---|---|
username | 必須。 150文字以下。 ユーザー名には英数字が含まれている場合があります |
first_name | オプション(blank=True)。150 文字以下。 |
last_name | オプション(blank=True)。150 文字以下。 |
オプション(blank=True)。メール | |
password | 必須。パスワードのハッシュとメタデータ。 |
一部ですが標準のUserモデルは上記のようなfieldに対して値を設定できます。
webアプリケーションを作成する際にユーザーの情報としてもっとたくさんのfieldを定義したい!!といったときにカスタムユーザを定義する必要があります。
というか、アプリ作成をするにあたってカスタムユーザーの定義は必須です。前述の通り、Djangoの公式でもUserモデルは非推奨とされており、その理由はUserモデルで一度定義していまうと(migrationすると)もうカスタムユーザーにはできないからなんです。
要はあとからアプリの拡張をしたいと思ってユーザのfieldに追加したい項目ができても変更ができないということです。
参考:https://docs.djangoproject.com/en/4.2/ref/contrib/auth/
カスタムユーザ作成方法
実際にカスタムユーザーを定義していきますが大きな手順としては以下の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ファイルに以下の記述を加えます。
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アプリ開発がんばっていきましょ~~~