見出し画像

【80日目】Django_新規ユーザーの作成方法その1_プログラミング学び日記

 このnoteは、31歳未経験からエンジニアを目指して勉強していく記録を綴っているものです。現在はAdTechでカスタマーサクセスを担当しつつ、色んなチャンスに恵まれ、CS業務や子育てと並行しながらチャレンジしています。

 これからプログラミングを始める方にとってのTipsやモチベアップに繋げられるように頑張りたいと思っています。
--------------------------------------------

Djangoの動画シリーズも終盤に差し掛かってきました。今日と明日に分けて、新規ユーザーの登録方法についてアウトプットしたいと思います。今回も複雑で、バタバタしていたのもありますが学習からアウトプットまで数日かかっています。

これが終わったら、作成したTodoアプリを少し改修してブラッシュアップする取組をやっていこうと思います。


こちらの動画を参考に進めています。


本日はサインアップ機能についてまとめます(メール認証はその2で)。


models.pyに「User」モデルを追加

モデルはモデルなのですが、サインアップ用のものはいつものモデルとは少し異なります。「AbstractUser」という特別なクラスをインポートして、それを継承してUserを作成します。こうすることで、Djangoで使えるユーザー機能を自分でカスタマイズできるようになります。また、Userのモデルは特別で、プロジェクトに一つしか持たせることができません。

カスタマイズしないのであればわざわざUserを設定する必要はありませんが、後からカスタマイズしたくなった時、最初に設定していないと大変になるらしく、設定しておいた方が無難みたいです。

[models.py]
 
from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    # AbstractUserのうちカスタマイズするものだけを以下に指定する
    # メールアドレスはデフォルトでnullはOK、他ユーザーとの重複もOKになっているためカスタマイズする
    # yunique=Trueにすると重複できないし、nullにもできなくなる。
    email = models.EmailField('メールアドレス', unique=True)   


Userモデルを全体設定のsettings.pyに設定する

作成したUserモデルをこのプロジェクトで使うことをDjangoに知らせます。「AUTH_USER_MODEL」がプロジェクト全体で使うUserモデルで、これをsettings.pyの一番下に記載します。

[settings.py]
 
# 以下の記載で「registrationアプリの中のmodels.pyの中のUserというモデルを探す」という定義になる
AUTH_USER_MODEL = 'registration.User'


新規ユーザー登録のためのフォームをforms.pyに作成する

新規登録するためのフォームを作成します。この時のファイル名は任意ですが、forms.pyとするのが一般的です。アプリのディレクトリ直下にファイルを作成します。このファイルはいくつかポイントがあります。

(1)Userモデルは「get_user_model」メソッドでインポートする
通常のモデルだと「from .models import User」でインポートしますが、Userモデルはこれだと上手く動かない場面があるそうです。正しくは「User = get_user_model()」でモデルを取得します

(2)UserCreationFormを継承してフォームを作成する
新規ユーザー登録用のフォームは、Djangoが元々用意している新規登録用のフォームを継承して作成します。ただ、デフォルトでは「メールアドレス」がフィールドに入っていないので、手動で追加します。

(3)フォーム内で「save」周りを設定する
ここが少し複雑なポイントです。まず、フォームを投稿した時に自動で呼ばれるsaveと、モデルに保存するため(=DBに書き込むため)のsaveが混在しています。以下の手順で処理しています。

 ①新規登録の投稿時、フォームのsaveが呼び出される
  →ただしemailはデフォルトでは自動でセットされてこない
  →パスワードやユーザー名はセットされてくる
 ②emailをDBに保存するための準備をする
  →変数userに値をセットする「user = super().save(commit=False)」
  →「commit=False」としておいてDBへの保存はまだしない
 ③手動でemailに値をセットする
  →「user.email = self.cleaned_data["email"] 」と記載
  →cleaned_dataでバリデーションOKのemaliの値を取得できる
 ④モデルのsaveを呼び出してDBに書き込む
  →user.save()でOK
 ⑤戻り値としてuserを返す

[forms.py]
 
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import get_user_model

User = get_user_model()


# UserCreationFormはDjangoが元々用意している新規登録用のフォーム
class SignUpForm(UserCreationForm):
    class Meta:
        model = User
        fields = ("username", "email", "password1", "password2")
    
    # このsaveはformのsave。フォームを投稿した時にこのsaveが呼ばれる
    def save(self, commit=True):
        # commit=Falseだと、DBに保存されない
        user = super().save(commit=False)  # まずはデフォルトのsaveを呼び出して、email以外のユーザー名やパスワードをセットする。commit=FalseにしておくとDBにはまだ書き込まれない 
        user.email = self.cleaned_data["email"]   # cleaned_dataでバリデーション済みのemailを取得してuserのemailにセット
        user.save()   # このsaveはmodelのsave。これでデータベースに書き込める
        return user


フォームを表示するためのビューを作成する

DBにユーザー情報を書き込んでいくので、CreateViewを継承してクラスを作成します。処理成功時のurlとテンプレートの名前も定義します。

[views.py]
 
from django.views.generic.edit import CreateView
from django.urls import reverse_lazy

from .forms import SignUpForm

# Userモデルでユーザーを作るためCreateViewを使う
class SignUpView(CreateView):
    form_class = SignUpForm
    success_url = reverse_lazy('login')
    template_name = 'registration/signup.html'


ビューのURLを設定する

viewを定義したので、いつも通りurlを設定しておきます。

[urls.py]
 
~中略~

urlpatterns = [
    ~中略~
    path("signup/", views.SignUpView.as_view(), name="signup"),
]


テンプレート上を作成する

これもいつも通り、新規登録用のテンプレートと、そのページに飛ぶためのリンクをログインページ等に作成します。


新規作成したUserモデルをマイグレーション(DBに登録)

忘れてはいけないのがマイグレーションです。ユーザー情報はDBに保存していくので、makemigrations→migrateでマイグレーションします。
マイグレーションの詳細は以下をご確認ください。



入院していた子供も無事に退院できました。
ほんと一安心です。
明日はしっかり遊んであげつつ、お昼寝時を狙って色々進めます!



これまで修了したコース等

【YouTube_Django関係】
Pythonでウェブサービスを作ろう! #1
テンプレートをマスターしよう! #2
静的ファイルを配信しよう !#3
本番公開しよう! #4
データベースと接続しよう! #5
ブログを作って学ぶモデル入門! #6
これが汎用ビューの力! #7
Djangoフォームを自由自在に操ろう! #8
djagoを最大限使って効率よくログインを作ろう! #9
ログイン完成!サインアップ & メール認証 #10
データベースマイグレーション前編 #15
データベースマイグレーション後編 #16

【Paiza】
Aランクレベルアップメニュー 24/49問
データセット選択メニュー 4/17問
配列メニュー      59/64問
ループメニュー1 20/20問
ループメニュー2 12/20問
条件分岐メニュー    25/25問
二重ループメニュー   19/19問
配列活用メニュー    26/26問
文字列処理メニュー   30/30問
Bランクレベルアップメニュー 62/62問
Cランクレベルアップメニュー 30/30問
ランクB合格
ランクC合格

【書籍/ブログ】
Django入門 | 初心者でも1時間でWebアプリ(Todoアプリ)を作成するコース
基礎からのMySQL     514/514頁
Web技術の基本      189/189頁 ※2周目中
京大のPython教科書    116/201頁
Pythonデータベースプログラミング 194/194頁
Pythonエンジニアファーストブック読了

【Progate】
Python Ⅰ~Ⅴ
Python アプリ版 コースⅠ~Ⅴ
SQL Ⅰ~ Ⅳ
SQL アプリ版 コースⅢ
HTML&CSS 初級編

【その他】
Pythonの環境構築
VSCodeの環境構築
MySQLの環境構築(MAMP)
Git / GitHubの環境構築
HEROKUの環境構築

この記事が気に入ったらサポートをしてみませんか?