本記事では「初めてのDjango(発展編)」として、初めてDjangoというフレームワークを使用してWebアプリケーションを作ってみたい!という方向けに、簡単なアプリケーションを作成しながら基本的な知識をご紹介していきます。
本シリーズの全容はこのようになっております。
- (入門編 #01)単一ページのアプリケーション作成まで
- (入門編 #02)CSSの適用からベーステンプレートの作成まで
- (入門編 #03)コンテキスト情報とテンプレートタグの活用
- (入門編 #04)お問い合わせフォームの設置、メール送信処理まで
- (入門編 #05)お問い合わせ送信後にメッセージを表示させる
- (入門編 #06)アプリケーションをGAEにデプロイ
- (発展編 #01)データベースの設定を行う
- (発展編 #02)カスタムユーザーモデルの定義、マイグレーション ←イマココ
- (発展編 #03)django-allauthで認証機能を実装する
- (発展編 #04)ListViewを用いてモデル情報を描写する
- (発展編 #05)CreateViewを使用してデータベースを更新
- (発展編 #06)DetailViewを用いて詳細表示
- (発展編 #07)UpdateViewを用いてデータベース編集
- (発展編 #07)UpdateViewを用いてデータベース編集
- (発展編 #08)DeleteViewを用いてデータベースのレコード削除
・認証用アプリケーションの作成
・Djangoにおけるモデルとは??
・カスタムユーザーモデルの定義
・マイグレーションの仕組み、やり方
認証用アプリケーションの作成
ユーザー登録を行い、会員となったユーザーのみが閲覧できるページや機能などを追加したい場合、ログイン・ログアウトといった認証機能が必要となってきます。
一気にアプリケーションぽいですね…
この認証機能をこれから実装していくのですが、他のアプリケーションからも共通で使用できるように、別のアプリケーションとして作成します。
アプリケーション作成
プロジェクトのルートディレクトリ(manage.pyがあるとこ)にて、ターミナル上で下記のコマンドを実行しましょう。
(venv_cafe)$ python manage.py startapp accounts
すると新規アプリケーション「accounts」フォルダが作成されます。
settings.pyに追加
新規アプリケーションを作成したときに行わなければならない作業があります。それは「プロジェクトにアプリケーションを追加する」という作業です。
アプリケーション作成とセットの作業ですね。
settings.py の一部を下記の一行を追加します。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'cafe_app.apps.CafeAppConfig',
'accounts.apps.AccountsConfig', # 追加
]
カスタムユーザーモデルについて
カスタムユーザーモデルというモデルの設定を行う前に、Djangoの認証周りの処理を実装するにあたって知っておいた方がよい知識を先に解説させていただきます。その方が「今何をやっているのか」が分かり、理解が深まると思います。
Djangoにおけるモデルとは?
一言で表すならば「Webアプリケーションにおいてデータベースとのやりとりを担うコンポーネント」です。各アプリケーション内ディレクトリ内にある models.py のことを指します。
例えばカフェの商品に関するテーブルを作成したいとします。通常、データベースにテーブルを作成したい場合はSQLを用いて作成します。
しかしDjangoにおいては、モデルにテーブルデータの内容を定義することで、作成するだけでなく追加・削除といった一連のデータベース操作を行ってくれます。
例ですが、このように定義していきます。
from django.db import models
name = models.Charfield(max_length=30)
price = models.IntegerField()
description = models.Charfield(max_length=255)
詳細はここでは触れませんが、「データベースのテーブル情報を定義する」という認識で今は大丈夫です。
マイグレーション(Migrations)
モデルにテーブルの項目を定義した時点では、まだテーブルは作成されておりません。マイグレーションという処理をを行うことで、モデルに定義した情報を基にdjangoがテーブルを作成してくれます。
したがって、テーブルを作成するまでの流れは、
- モデル(models.py)にテーブル情報を定義する。
- マイグレーション
となります。
ただし厳密には「モデルクラスの定義内容をデータベース内にテーブルとして反映する」機能です。したがって、models.pyにモデルクラスを新たに作成したり、変更した場合は必ずマイグレーションする必要があります。
ユーザーモデルについて
やっと話が戻ってきました。
上記で、新しくテーブルを作成・更新したい場合は、モデルクラスに色々項目を「自分で」定義するということをお話ししました。
しかし、Djangoで認証機能を実装する場合は、ユーザーモデル(django.contrib.auth.models.User)という元々Djangoに用意されているモデルを使用します。すなわち認証に必要な項目やらが既に用意されているのです。
- 通常のモデル → 自分で作る
- 認証用のユーザーモデル → もともとある
またDjangoの認証の仕組みが、このユーザーモデルを使用するのです。したがって、認証というデリケートな仕組みをゼロから構築する必要はなく、このユーザーモデルを使用してDjangoが認証機能を提供してくれます。
このユーザーモデルには「ユーザー名(username)、メールアドレス(email)、…」などが項目として定義されています。こちらからも確認できます。
ところがこのユーザーモデルの欠点として、ユーザー名(username)が認証キーとして使用されている点です。したがって、この「認証キーをメールアドレスに変更したい!」といった場合は、モデル間の整合性をチェックしながら手作業で修正していく必要があります。
この問題を解決するために、自分好みにカスタマイズしたユーザーモデル、すなわちカスタムユーザーモデルを作成します。
Django公式もカスタムユーザーモデルの使用を強く推奨しております。
カスタムユーザーモデル
でも「結局自分でゼロからカスタムユーザーモデルを作るの?」と思いませんか?
実はユーザーモデルというのは、これまたDjangoに元々ある「AbstractUser」というモデルを継承して作成されています。
Githubからも分かります。
カスタムユーザーモデルを作成する際は、この「AbstractUser」を継承して作成します。
ただ単に「AbstractUser」を継承しただけだと、「User」と同じようなモデルになってしまいますので、アプリの要件に応じてフィールドやメソッドのカスタマイズを行います。
認証に使用するモデルを変更
またカスタムユーザーモデルを作成しただけでは、認証時にDjangoはまだユーザーモデルを参照してしまいます。なので、単純に、認証時に使用するモデルをカスタムユーザーモデルに変更すればよいだけです。
管理画面でのユーザーのモデルをカスタムユーザーに変更する
Djangoでは、管理画面(admin画面)にてユーザーの管理を行うことができます。デフォルトだと管理対象がユーザーーモデルなので、先ほどと同様カスタムユーザーモデルを管理するように変更してあげる必要があります。
カスタムユーザーモデルの定義
では実際に、ここまで紹介した
- カスタムユーザーモデルの定義
- カスタムユーザーモデルの参照
- 管理画面(admin)にカスタムユーザーモデルを参照させる
- マイグレーション
を行っていきます。
カスタムユーザーモデルの定義
accountsアプリケーションの models.py を下記のように修正してください。
cafe_app内のmodels.pyではないので注意です。
from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
""" カスタムユーザーモデル """
class Meta:
verbose_name_plural = 'CustomUser'
上記から分かるように、作成したカスタムユーザーモデル内にはほとんど中身がありません。今回のアプリケーションでは、認証機能のほとんどは「django-allauth」というライブラリを使用するためです。
Djangoにカスタムユーザーモデルを参照させる
Djangoに、認証時にカスタムユーザーモデルを参照してもらうような設定を行います。settings.py に下記を追加してください。
# 認証時にカスタムユーザーモデルを参照する
AUTH_USER_MODEL = 'accounts.CustomUser'
これでデフォルトのユーザーモデルではなく、作成したカスタムユーザーモデルを参照するようになります。
管理画面でカスタムユーザーモデルを参照させる
続いて、管理画面でもカスタムユーザーモデルを参照させます。accountsアプリケーション内の admin.py を下記のように編集します。
from django.contrib import admin
from .models import CustomUser
# 管理サイトにカスタムユーザーモデルを登録する
admin.site.register(CustomUser)
マイグレーション
最後に、ここまでに定義したモデル(カスタムユーザーモデル)の情報をデータベースに反映(マイグレーション)しましょう。
Djangoではコマンド実行するだけで、モデルの定義を読み取り自動でデータベースを更新してくれます。この作業は2段階で行います。
makemigrations
まず下記のコマンドにより、データベースへの変更内容を記したマイグレーションファイルを作成します。
(venv_cafe)$ python manage.py makemigrations
このコマンドを実行すると、プロジェクトのルートディレクトリに「migrations/0001_initioal.py」というファイルが作成されます。
この中にデータベースを更新するための情報が記述されています。
この時点ではデータベースは更新されておりません。
migrate
続いて下記のコマンドによって、先ほど作成したマイグレーションファイルを基にマイグレーションを行います。
(venv_cafe)$ python manage.py migrate
コンソールに下記のような結果が出力すれば成功です。
Operations to perform:
Apply all migrations: accounts, admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0001_initial... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying accounts.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying sessions.0001_initial... OK
無事マイグレーションが完了しました。
この流れを図で表すと次のようになります。
この時点でのコード全体をGithubに載せております。確認用としてお使いいただければと思います。
まとめ
本セクションでは、Djangoの認証に必要なカスタムユーザーモデルの知識や、実際に定義してマイグレーションを行うとこまでをご紹介させていただきました。
手を動かす部分は少なかったですが、重要な部分です。理解する手助けになれば幸いです。
次回は実際に「django-allauth」というパッケージを用いた認証機能を実装する方法をご紹介します!
コメント
コメント一覧 (6件)
[…] (発展編 #02)カスタムユーザーモデルの定義、マイグレーション […]
[…] (発展編 #02)カスタムユーザーモデルの定義、マイグレーション […]
[…] (発展編 #02)カスタムユーザーモデルの定義、マイグレーション […]
[…] ここまで作業が完了した時点でマイグレーションを行いましょう。(マイグレーションについてはこちらで解説しております。) […]
[…] (発展編 #02)カスタムユーザーモデルの定義、マイグレーション […]
[…] (発展編 #02)カスタムユーザーモデルの定義、マイグレーション […]