naritoブログ

【お知らせ】
新ブログができました。今後そちらで更新し、このサイトは更新されません(ウェブサイト自体は残しておきます)
このブログの内容に関してコメントしたい場合は、新ブログのフリースペースに書き込んでください

このブログの内容を新ブログに移行中です。このブログで見つからない記事は、新ブログにありま

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

約170日前 2018年4月28日17:20
プログラミング関連
Bootstrap4 Django Python シリーズもの

概要


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

いくつかのテンプレートは使いまわすことができそうだったり、そもそもビューを継承して自作するまでもなく、urls.py側での引数で対応できるものもありますが、カスタマイズしやすいように全て手作りしています。

Gtihubからクローンしregisterアプリケーション(登録機能全般を詰めたアプリケーション)をカスタマイズしたり、forms.pyに定義している各フォームをimportして使うだけに留める、なども可能だと思います。(フォームは全て、Bootstrap4に対応するための処理をしています)


Userモデルのカスタマイズ


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

Userモデルのカスタマイズは強力ですが、ある特定の機能や、何らかのアプリケーションに特科するようなカスタマイズを行う場合、OneToOneで別モデルと紐づけるほうが便利なこともあります。この方法はそのアプリケーション内で完結するため、再利用がしやすくなります。

ログイン画面


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

また、ログインの際にreCAPTCHAを使うことも簡単です。

ユーザー登録


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

マイページ


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

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


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


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


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

Djangoで、フォームの内容を保持する(Context編)や、Djangoで、フォームの内容を保持する(セッション編)といった方法があります。
他にも、
画面内に入力エリアと確認エリア(こっちは最初display:none;にしとく)を設けておき、入力エリアの内容をJavaScriptで都度確認エリアに反映させ、「確認画面へ」を押すと、入力エリアをdisplay:none;に、確認エリアをdisplay:blockに、といった原始的な方法もあります。
これはinput type="file"なタグが多い場合には最適です(fileタグには原則初期値を設定できず、画像だった場合、確認画面でのプレビューが面倒なため)
デメリットは、素直に実装するとバリデーション処理をJavaScriptで行う必要が出てくることですね。(確認画面で送信後に、Djangoでバリデーションすることはできます...)

完成品が欲しい方


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.pyのAUTH_USER_MODELをコメントアウトし、関連ファイル(db.sqlite3等)を削除後、上の手順を行ってください。
カスタムUserを使った後に通常のUserで試したい場合も同様に、関連ファイル(db.sqlite3やmigrationsディレクトリ)を削除後、上のmigrate以降を実行します。

リンク


c-bata氏 DjangoCongress JP 2018発表内容Django における認証処理実装パターン
@voluntas 約268日前 2018年1月20日23:18 返信する
とても勉強になる記事をありがとうございます。ただちょっと気になったので regist という英単語はないので、register にしたほうがいいかもしれません。

http://yanok.net/2010/08/-regist.html
なりと 約268日前 2018年1月21日0:06
これは知りませんでした。ありがとうございます。
名無し 約246日前 2018年2月11日17:14 返信する
大変勉強になりました。ありがとうございます。
1点ユーザーデータの更新ページに関してですが、現在の
url(r'^user_update/(?P<pk>[0-9]+)/$',views.UserUpdateView.as_view(), name='user_update'),
の設計ではアドレスバーに別の数値を入力した場合、他人のデータを更新出来るのではないでしょうか?
なりと 約246日前 2018年2月11日23:26
おっしゃるとおり、ユーザー登録さえしていれば他人の情報でも更新することができます。UserPassesTestMixinの利用や、dispatchメソッドの上書きをする方が良さそうです。そのうち、記事も更新するかもしれません。
生徒 約183日前 2018年4月15日16:55 返信する
いつも楽しく拝見しております。
narito先生制作のログイン、会員登録フォームについて質問します。
ログインフォームを、トップページに配置する方法について教えて頂けませんでしょうか。

login,htmlのtemplateをそっくりindex.htmlに持ってきて、base.htmlやのタグも書き換えたのですが、ログイン、会員登録のデザインは無事にトップページに表示できても、フォーム部分だけが表示できません。

手がかりだけでも教えて頂けると嬉しく思います。
なりと 約183日前 2018年4月15日19:59
コメント欄でファイルを添付ができるようにしましたので、現在のプロジェクト一式を添付していただけますか。
HANA 約166日前 2018年5月2日9:24 返信する
非常に参考になりました。DjangoはAjaxが使い辛いため距離を置いていましたが、やっぱりDjangoを使おうと思える丁寧な記事でした。これからのご活躍を応援させてください。
ある 約132日前 2018年6月5日15:31 返信する
非常に参考にさせていただいております。
一点お聞きしたいです。

以前本ページのカスタムUserモデルを試したのですが、本日他のプロジェクトを作成し、python manage.py createsuperuserの後admin/でログインすると本ページと同様のページが見られました。

カスタムユーザモデルは一度作成すると以降他のプロジェクトでも引き継がれていくものなのでしょうか。

私としては以前のプロジェクトのvirtualenvで作成したカスタムユーザモデルが本日のプロジェクトのvirtualenvで見られることは非常に受け入れがたく思っています。本日のプロジェクト内で新たにUserモデルを定義したり、settings.pyでAUTH_USER_MODELの指定などは行っておりません。

よろしくお願いします。
なりと 約132日前 2018年6月5日18:31
カスタムユーザーは、そのDjangoプロジェクト内でしか有効ではありません。
言い換えるとそのDjangoプロジェクト内にregisterディレクトリが存在しないなら、カスタムユーザーは使われません。
例外として、registerアプリケーションをpip等でインストールし、そのDjangoプロジェクトのINSTALLED_APPS等で読み込ませていたり、そもそも前に動かしたrunserverがまだ生きている、等はありえます。

/adminのページですが、これはそもそもDjangoデフォルトの管理画面で、registerアプリケーションは殆ど影響していません。