Djangoで、会員登録機能を自作する

Twitterでシェア FaceBookでシェア はてなブックマークでシェア

Python - Django
2018年11月22日21:34に更新(約21日前)
2018年10月19日5:16に作成(約55日前)

旧ブログ移行記事です。

概要

Djangoで、会員登録機能を自作していきます。 メールアドレスをユーザー名として使うようにし、ログイン画面、仮登録、メールクリックで本登録、ユーザー情報変更ページ、パスワード変更ページ、パスワードを忘れた際の再設定...などなど、よくある一連の機能を実装します。 また、できるだけデフォルトのUserモデルでも動作するように実装していきます。

Userモデルのカスタマイズ

Djangoで、Userモデルのカスタマイズ(継承)
メールアドレスをユーザー名として使うように、Userモデルをカスタマイズします。

ログイン画面

Djangoでログイン画面を自作する
Djangoにもログイン画面は付属していますが、自分のウェブサイトのイメージと違う場合は自作することになります。簡単に作れます。

ユーザー登録

Djangoでユーザー作成処理(仮登録後、URLクリックで本登録)
ユーザー登録機能と、仮登録後にメールが届き、それにアクセスさせると本登録する、といった機能を実装します。

マイページ

Djangoで、ユーザー情報閲覧・更新ページの作成
ユーザー情報の閲覧、更新ページです。閲覧と更新ページには、自分とスーパーユーザー以外はアクセスできないようにもします。

パスワード変更、パスワード忘れ

Djangoで、パスワード変更ページと忘れた際の再設定ページ
パスワードの変更ページと、パスワードを忘れた際の再設定ページを作ります。

入力内容の確認画面を作るには

素直に実装していくと、入力画面→確認画面 へどうやって入力データを渡し、確認画面からはどうやって前画面で入力されたデータを送信するのかについてを考えることになります。

Djangoで、フォームの内容を保持する(Context編)や、Djangoで、フォームの内容を保持する(セッション編)といった方法があります。

他にも、

  1. html内に入力エリアと確認エリア(こっちは最初display:none;にしとく)を設けておく
  2. 入力エリアの内容をJavaScriptで都度確認エリアに反映させる
  3. 「確認画面へ」を押すと、入力エリアをdisplay:none;に、確認エリアをdisplay:blockにする

といった方法もあります。
これはinput type="file"なタグが多い場合には最適です(fileタグには原則初期値を設定できず、画像だった場合、確認画面でのプレビューが面倒なため)

デメリットは、素直に実装するとバリデーション処理をJavaScriptで行う必要が出てくることですね。(確認画面で送信後に、Djangoでバリデーションすることはできます...)

OneToOneの方が良さそうなケース

Userモデルのカスタマイズは強力ですが、OneToOneで別モデルと紐づけるほうが便利なこともあります。

既に稼働中のDjangoプロジェクトに導入したい場合

DjangoのUserモデルは、途中から切り替えるのが困難です。そのため、既に稼働中のDjangoプロジェクト内のUserモデルに手を加えたい場合は、OneToOneで拡張するのが無難な方法になります。

他アプリケーションでカスタムUserを定義している場合

言うまでもなく、Userは1種類しか使えません。
他アプリケーションの導入を諦めるか、もしくは他アプリケーションのカスタムUserと互換性があり、かつ自分の要求を満たすカスタムUserを新しく定義するという方法になってしまいます。しかしそれが動くかは他アプリケーションの実装次第であり、労力的に見合わないことも多いです。

Djangoアプリケーションとして配布したい場合

既に2つのケースを書きましたが、それらはユーザー側の視点でした。見方を変えると、ユーザー側の視点では稼働中のDjangoプロジェクトに導入できなかったり、互換性のために自前のカスタムUserが肥大化するのは避けたいはずです。

完成品

Githubにソースコードを置いています。

インストールして...

git clone https://github.com/naritotakizawa/django-register-sample
pip install django

すぐに試せます。

python manage.py makemigrations register
python manage.py migrate
python manage.py runserver
python manage.py createsuperuser

デフォルトではカスタムしたUserモデルを使います。 それが嫌な場合は、settings.pyAUTH_USER_MODELをコメントアウトし、上の手順を行ってください。

カスタムUserを使った後に通常のUserで試したい場合は、関連ファイル(db.sqlite3migrationsディレクトリ)を削除後、上の手順を実行してください。

Twitterでシェア FaceBookでシェア はてなブックマークでシェア

記事にコメントする

名無し
2018年12月12日22:57にコメント(約1日前)

このアプリケーションを実行後、ログイン画面からユーザを登録、送信ボタンを押した後、エラーが発生してしまいました。 私だけでしょうか?

コメントに返信する