1.6K Views
May 18, 25
スライド概要
PythonのWebフレームワークであるDjangoを使ったWebプログラミング学習の教材です。
ユーザー認証(ログイン)機能をテーマとしています。
IT業界に優秀なエンジニアを集め、皆で面白いプロジェクトをやることを目指す人。
Python/Django Webプログラミング学習 ユーザー認証機能 Pythonプログラミング学習テキスト © 2025 Hibiki Iwamoto All Rights Reserved
自己紹介 名前 岩元 響生 Hibiki Iwamoto 経歴 SI業界で約25年 プログラマ〜プロジェクトマネージャ スクラッチ開発を多数経験 SNS note, X ◆note https://note.com/hibiki_i ◆X (旧Twitter) @hibiki_note 目標 IT業界に優秀なエンジニアを集め、 皆でワクワクする仕事が出来る 環境づくり 2 © 2025 Hibiki Iwamoto All Rights Reserved
概要・ゴール 概要 本書は、PythonのWebフレームワークであるDjango(ジャンゴ)の学習を目的としています。 特にユーザー認証(ログイン機能)の導入を解説しています。 ユーザー認証機能を通して、Django内部の基本的な構成・動きも理解していきます。 提供されている基本機能に対して変更を加えていくという、実践に近い形で学習していきます。 ゴール Djangoのルーティング処理を理解すること Djangoのユーザー認証機能の動きを理解すること 独力でユーザー認証機能をカスタマイズ出来るようになること 3 © 2025 Hibiki Iwamoto All Rights Reserved
想定読者 想定読者 本書は、下記の読者を想定しています。 ITエンジニアを目指している Pythonとは何かを理解している(Pythonでプログラミング出来なくても大丈夫です) HTMLとは何かを理解している(HTMLを書けなくても大丈夫です) Webシステムの開発をやってみたい ユーザー認証の仕組みを学びたい プログラミングの学習に挫折したことがある 学習環境の構築が面倒で、早くプログラミングしたい 文法の勉強はもう飽きた 実践的な学習方法がスキ 4 © 2025 Hibiki Iwamoto All Rights Reserved
01 前提条件・構成 本書での解説にあたり前提条件があります。 最初にお一読ください。 6 © 2025 Hibiki Iwamoto All Rights Reserved
前提条件 本書は、Qiitaにて無料公開している下記の記事に従い、環境構築を終えて いることを前提としています。環境構築がお済みでない方は、先に環境構 築を行ってから、本書を読み進めてください。 プログラミング初心者向けDjango開発環境構築 また、gitのクローン作成時に指定するURLはこちらです。 https://github.com/hibiki-iwamoto/django-learn-auth01.git 本書での学習の進め方については、下記記事で説明している学習コンセプ トに基づいています。学習コンセプトを理解した上で進めて頂くことで、 より納得感を持って学習が出来ますので、ぜひご一読ください。 「仕事で使える」プログラミングは”逆算思考”で身に付ける 7 © 2025 Hibiki Iwamoto All Rights Reserved
システム構成 Python 3.11.12 Django 5.2 Poetry 2.1.2 ※環境構築時の最新バージョンとなる データベース無し ※Pythonの標準ライブラリに含まれているSQLiteを使用しています。 ※そのため、データベースシステムはインストールしていません。 (データベースは、以下“DB”と記載します) 8 © 2025 Hibiki Iwamoto All Rights Reserved
開発環境構成 Visual Studio Code (以下、“VS Code”と記載します) Docker Desktop git ※開発環境のインストールについては下記の記事を参照ください。 プログラミング初心者向けDjango開発環境構築 ※本書はWindows環境を前提にしていますが、 Visual Studio Code, Docker, git が使用できれば、Windows以外でもご利用頂けます。 9 © 2025 Hibiki Iwamoto All Rights Reserved
02 ベースライン解説 ベースラインとは環境構築後の状態を指しています。 ベースラインでは最低限の実装、設定がされています。 本章では、ベースラインでの実装、設定について解説 します。 10 © 2025 Hibiki Iwamoto All Rights Reserved
仕様 ベースラインは下記の機能があります。 デバッグ実行しながら、確認してみてください。 (デバッグ実行の方法は巻末の「お役立ち情報 - デバッグ実行手順」で説明しています) No 機能 ① ログイン画面表示 ② ログイン実行 ③ ログアウト実行 ④ 未ログイン状態ではログイン画面にリダイレクト ⑤ 管理者ログイン画面、管理者画面 次スライド以降、1つずつ解説します。 11 © 2025 Hibiki Iwamoto All Rights Reserved
仕様 ①ログイン画面表示 下記のURLにアクセスすると、ログイン画面が表示されます。 http://localhost:8000/login/ ログイン画面に表示される入力項目は 1.ユーザー名 2.パスワード です。 Djangoは標準でログイン機能を提供しています。 この標準機能では、ユーザーIDとして「ユーザー 名」を使用しています。ユーザーIDとして「メー ルアドレス」を使用する方法は、「変更要件」に て解説します。 12 © 2025 Hibiki Iwamoto All Rights Reserved
仕様 ②ログイン実行 ユーザー名、パスワードを入力し、「ログイン」ボタンをクリックするとメインページが表示されます。 ユーザー名、パスワードは下記内容で登録されています。 ユーザー名 :admin パスワード :P@ssw0rd ← wの次は数字のゼロです メインページには 1.固定メッセージ「メインページ」 2.「ログアウト」ボタン のみ配置されています。 ユーザー名またはパスワードが間違っている 場合、エラーメッセージが表示されます。 13 © 2025 Hibiki Iwamoto All Rights Reserved
仕様 ③ログアウト実行 メインページにて「ログアウト」ボタンをクリックすると、ログイン画面に戻ります。 14 © 2025 Hibiki Iwamoto All Rights Reserved
仕様 ④未ログイン状態ではログイン画面にリダイレクト ログアウトした後にメインページのURLを直接入力すると、ログイン画面が表示されます。 メインページURL http://localhost:8000/mainapp/ 強制的にログイン画面が表示された場合、 URLに「?next=/mainapp/」が付きます。 「/mainapp/」が指定されていることで、 ログイン成功後にメインページに遷移します。 15 © 2025 Hibiki Iwamoto All Rights Reserved
仕様 ⑤管理者ログイン画面、管理者画面 管理者ログイン画面のURLを入力すると、管理者ログイン画面が表示されます。 管理者としてログインが成功すると、管理者画面が表示されます。 管理者ログイン画面URL http://localhost:8000/admin/ ユーザー名:admin パスワード:P@ssw0rd ↑ wの次は 数字のゼロです Djangoは標準で管理者ログイン機能および 管理者機能を提供しています。 管理者機能では、ユーザー登録等が操作可 能です。後ほど説明します。 16 © 2025 Hibiki Iwamoto All Rights Reserved
フォルダ・ファイル構成 ベースラインは下記のフォルダ、ファイル構成となっています。 VS Codeにて「エクスプローラ」アイコンをクリックすると、フォルダ・ファイル構成が表示されます。 最初はフォルダやファイルが多く感じるかもしれません。 しかし、最初に覚えるべきフォルダやファイルは数個のみです。 赤字で示しているもののみに注目してください。 また、最初は内容も覚える必要ありません。 どのフォルダに、赤字で示したフォルダ、ファイルがあるか だけを理解して頂ければ大丈夫です。 17 © 2025 Hibiki Iwamoto All Rights Reserved
フォルダ・ファイル構成(トップレベル) トップレベルに存在するフォルダ・ファイル構成を説明します。 名前 種類 説明 .devcontainer フォルダ コンテナに関する環境設定用のファイルを含んでいます。 変更不要です。 .vscode フォルダ デバッガに関する設定ファイルを含んでいます。 変更不要です。 sandbox フォルダ 本書で解説するWebアプリケーションを含んでいます。 今後の解説は、sandboxフォルダ内のファイルが対象となります。 .gitattributes .gitignore ファイル Gitに関する設定ファイルです。 変更不要です。 ★本ページで覚えておくのは、「sandbox」フォルダのみです 18 © 2025 Hibiki Iwamoto All Rights Reserved
フォルダ・ファイル構成(sandbox内) メインアプリケーションである「sandbox」フォルダ内のフォルダ・ファイル構成を説明します。 名前 種類 説明 accounts フォルダ ユーザー認証に必要なプログラムを含んでいます。 3章の変更要件では、当該フォルダ内のファイルを主に編集します。 mainapp フォルダ メインページの表示に必要なプログラムを含んでいます。 sandbox フォルダ 当該システム全体の設定を含んでいます。 db.sqlite3 ファイル データベースSQLite用データ格納ファイルです。 当該ファイルを直接編集することはありません。 manage.py ファイル Djangoプロジェクトに対する管理タスクを実行するコマンドユーティ リティです。 ★本ページで覚えておくのは、「accounts」フォルダと「sandbox」フォルダのみです 19 © 2025 Hibiki Iwamoto All Rights Reserved
Djangoのフォルダ・ファイル構成 参考までにDjangoプロジェクトの作成手順を説明します。 本書内では、追加でDjangoプロジェクトを作成することはありませんので、あくまで参考情報となります。 ①下記コマンドにてプロジェクト作成 ※プロジェクト名は任意 $django-admin startproject sandbox 本書で解説しているプロジェクトでは「sandbox」というプロジェクト名を指定しています。 ②sandboxフォルダ内でアプリ作成 ※アプリ名は任意 $cd sandbox $python manage.py startapp mainapp $python manage.py startapp accounts ①のコマンドにて、sandboxフォルダが作成され、そのフォルダ内にmanage.pyが配置されます。 manage.pyを使用して、mainappとaccountsという名前のアプリを作成しています。 プロジェクト作成は最初に1回のみ実行します。 一方、アプリは後から機能拡張に伴い追加することがあります。 20 © 2025 Hibiki Iwamoto All Rights Reserved
フォルダ・ファイル構成(sandbox/sandbox内) プロジェクト作成時に作成される「sandbox」プロジェクトフォルダ内のフォルダ・ファイル構成を説明します。 名前 種類 説明 __pycache__ フォルダ Pythonがコンパイルしたファイルを格納するフォルダ。 Pythonにより管理されています。変更不要です。 __init__.py ファイル 当該フォルダがPythonのパッケージであることを示すファイル。 パッケージの初期化処理が必要な場合のみ編集します。 asgi.py ファイル 非同期処理を実装する時にソースコードを記述するファイル。 本書では変更不要です。 settings.py ファイル プロジェクト全体の設定を記述するファイル。 urls.py ファイル 指定されたURLとプログラムの紐づけを定義するファイル。 wsgi.py ファイル 同期処理を実装する時にソースコードを記述するファイル。 本書では変更不要です。 ★本ページで覚えておくのは、「settings.py」ファイルと「urls.py」ファイルのみです 21 © 2025 Hibiki Iwamoto All Rights Reserved
フォルダ・ファイル構成(sandbox/accounts内) 1 / 2 アプリとして作成した「accounts」アプリフォルダ内のフォルダ・ファイル構成を説明します。 数が多いため、2スライドに分割しています。 名前 種類 説明 __pycache__ フォルダ Pythonがコンパイルしたファイルを格納するフォルダ。 Pythonにより管理されています。変更不要です。 migrations フォルダ 当該アプリのDBスキーマの変更履歴を管理するフォルダ。 Djangoにより管理されています。変更不要です。 templates フォルダ HTMLファイルを格納するフォルダ。 サブフォルダとしてaccountsフォルダがあり、accountsフォルダ内に login.htmlが格納されています。 __init__.py ファイル 当該フォルダがPythonのパッケージであることを示すファイル。 パッケージの初期化処理が必要な場合のみ編集します。 admin.py ファイル 管理者機能をカスタマイズする際に使用するファイル。 3章の変更要件にて編集します。 ★本ページで覚えておくのは、「templates」フォルダのみです 22 © 2025 Hibiki Iwamoto All Rights Reserved
フォルダ・ファイル構成(sandbox/accounts内) 2 / 2 アプリとして作成した「accounts」アプリフォルダ内のフォルダ・ファイル構成を説明します。 数が多いため、2スライドに分割しています。 名前 種類 説明 apps.py ファイル 当該アプリの設定を行うファイル。 本書では変更不要です。 models.py ファイル 当該アプリで使用するDBのテーブルとフィールドを定義するファイ ル。3章の変更要件にて編集します。 tests.py ファイル テスト用のコードを実装するファイル。 本書では変更不要です。 urls.py ファイル 指定されたURLとプログラムの紐づけを定義するファイル。 views.py ファイル 当該アプリのメイン機能を実装するファイル。 本書では変更不要です。 ★本ページで覚えておくのは、「urls.py」ファイルのみです 23 © 2025 Hibiki Iwamoto All Rights Reserved
内部の挙動 フォルダやファイルの構成だけでは、実際にどのように動いているのかを理解するのは困難です。 次スライドからブラウザで操作した時に、内部でどのような挙動をしているのかを見ていきます。 文字が小さく、何が書かれているかを判別しづらいため、拡大して見て頂くか、お手元のソースコードを 参照ください。 ファイル個別の説明は後ほど出てきます。ファイル内部の詳細にはこだわらず、ここではDjangoが どのような順番でファイルを参照しながら動いているかを理解してください。 内部の挙動が理解できるようになると、問題が発生した時でも自力で解決できる可能性が高くなります。 24 © 2025 Hibiki Iwamoto All Rights Reserved
内部の挙動 - ①ログイン画面表示 ①ログイン画面表示 下記URLにアクセスし、ログイン画面が表示される時の動きです。 Django http://localhost:8000/login/ リクエスト ’/login/’ レスポンス sandbox accounts urls.py urls.py ① ② ③ settings.py templates/accounts index.html ①ブラウザから「/login/」へのリクエストを受け取り、 sandboxのurls.pyから「login」を探します。 該当が無いため、最終行で指定されている ④ accounts/urls.pyに飛びます。 ②ここには「login」があるため、指定されたHTML 「accounts/login.html」を探します。 ③該当のHTMLファイルを読み込みます。 ④HTMLの内容をブラウザへレスポンスとして返します。 25 © 2025 Hibiki Iwamoto All Rights Reserved
内部の挙動 - urls.py ブラウザからリクエストを受けてから、urls.pyの定義に基づいて次の処理を判断する動きを解説します。 sandbox(プロジェクトフォルダ)内のurls.pyの定義を例にします。 リクエスト http://localhost:8000/mainapp/ ‘mainapp/’をurlpatternsの定義を上から検索 1個目のpath関数の第1引数 ‘admin/’ と比較 第2引数に使われているinclude関数は、 URLに関する判定処理を、別のURL設定 ファイルに委譲するために使用されま す。 一致しないため次へ 2個目のpath関数の第1引数 ‘mainapp/’ と比較 一致したため、第2引数へ 2個目のpath関数の第2引数 ‘mainapp.urls’ に基づいて、 mainappフォルダ内のurls.pyをチェック 26 © 2025 Hibiki Iwamoto All Rights Reserved
内部の挙動 - ②ログイン実行 1/2 ②ログイン実行 ユーザー名、パスワードを入力し、「ログイン」ボタンをクリック、メインページが表示される時の動きです。 ログイン実行はステップが多いため、2スライドに分けて記載します。 Django リクエスト ’/login/’ sandbox accounts urls.py urls.py ① リダイレクト ③ settings.py ② ③ templates/accounts index.html ①ブラウザから「/login/」へユーザー名とパスワードの 認証リクエストを受け取り、sandboxのurls.pyから 「login」を探します。該当が無いため、最終行で 指定されているaccounts/urls.pyに飛びます。 ②accountsのurls.pyで指定されているLoginViewにて ログイン処理が行われた後、設定に従ってログイン後の 遷移が行われます。 ③遷移先はsandboxのsettings.pyで 指定されている「/mainapp/」と なり、ブラウザへリダイレクトを 返します。 27 © 2025 Hibiki Iwamoto All Rights Reserved
内部の挙動 - ②ログイン実行 2/2 ②ログイン実行 ユーザー名、パスワードを入力し、「ログイン」ボタンをクリック、メインページが表示される時の動きです。 Django リクエスト ’/mainapp/’ sandbox mainapp urls.py urls.py ④ ⑤ レスポンス ⑥ settings.py views.py index.html ④sandboxのurls.pyから「mainapp」を探します。 ⑤「mainapp」に紐づけられているmainapp内の templates/mainapp urls.pyを検索します。 ⑥mainappに届いたすべての処理はviews.py内の index関数にパスされます。 ⑦index関数内で定義しているHTMLファイル 「mainapp/index.html」を探し、読み込みます。 ⑧HTMLの内容をブラウザへレスポンスとして返します。 ⑦index.html ⑧ 28 © 2025 Hibiki Iwamoto All Rights Reserved
内部の挙動 - リダイレクト処理 前述の通り、リダイレクトの動きは2段構成となっています。 1回目のリクエストに対して、サーバからはリダイレクトというレスポンスが返ってきます。 2回目のリクエストは、リダイレクトで指定されたURLに対する要求を送っています。 このリダイレクトの動きは、Django特有のものではなく、どのようなWebシステムでも共通です。 1回目 リクエスト Django ’/login/’ /mainapp/へリダイレクト 2回目 リクエスト 1回目のレスポンスは、 /mainapp/へのリダイレクト指示 ’/mainapp/’ レスポンス 29 © 2025 Hibiki Iwamoto All Rights Reserved
内部の挙動 - ③ログアウト実行 ③ログアウト実行 メインページにて「ログアウト」ボタンをクリックすると、ログイン画面に戻ります。 リクエスト ’/logout/’ リダイレクト ①ブラウザから「/logout/」へのリクエストを受け取り、 Django sandbox accounts urls.py urls.py ① settings.py ② ③ templates/accounts index.html sandboxのurls.pyから「logout」を探します。 該当が無いため、最終行で指定されている accounts/urls.pyに飛びます。 ②ここには「logout」があるため、LogoutViewにて ログアウト処理が実行されます。 ③ログアウト後、sandboxのsettings.pyでの定義に 従い、「/login/」をリダイレクトします。 ※残りは「①ログイン画面表示」の処理と同じです。 30 © 2025 Hibiki Iwamoto All Rights Reserved
内部の挙動 - ④未ログイン時にログイン画面にリダイレクト ④未ログイン状態ではログイン画面にリダイレクト ログアウトした後にメインページのURLを直接入力すると、ログイン画面が表示されます。 メインページURL http://localhost:8000/mainapp/ リクエスト ’/mainapp/’ リダイレクト Django sandbox mainapp urls.py urls.py ① ’/login/?next=mainapp’ へのリダイレクト ⑤ settings.py ④ ② views.py ③ index.html ①ブラウザから「/mainapp/」へのリクエストを受け 取り、sandboxのurls.pyから「mainapp」を検索。 2行目で指定されているmainapp/urls.pyに飛ぶ。 ②mainappに届いたすべての処理はviews.py内の index関数にパス。 ③index関数には「@login_required」が付いている ため、ログイン状態を確認。 ④未ログイン状態であるため、ログイン画面のURL取得。 ⑤ログイン画面へのリダイレクトを ブラウザへ指示。 ※残りは「①ログイン画面表示」の 処理と同じです。 31 © 2025 Hibiki Iwamoto All Rights Reserved
内部の挙動 - ⑤管理者ログイン実行、管理者画面 ⑤管理者ログイン画面、管理者画面 管理者ログイン画面のURLを入力すると、管理者ログイン画面が表示されます。 管理者としてログインが成功すると、管理者画面が表示されます。 http://localhost:8000/admin/ リクエスト ’/admin/’ レスポンス ①ブラウザから「/admin/」へのリクエストを受け 取り、sandboxのurls.pyから「admin」を検索。 ②Djangoのライブラリ内に含まれているadmin機能を 呼び出し ① Django sandbox .venv urls.py lib/python3.11/site-packages ② >django >contrib >admin Djangoのライブラリは、sandbox フォルダ配下にありません。 /home/vscode/.localフォルダ内の奥の 階層に入っています。このフォルダを 参照することは可能ですが、変更しない ※管理者機能はすべてDjango提供のライブラリにて 提供されています。そのため、Djangoライブラリを 呼び出すだけとなります。 ようにしてください。 32 © 2025 Hibiki Iwamoto All Rights Reserved
内部の挙動 - ルーティング ブラウザからのリクエストはまずプロジェクトフォルダ(この場合、sandbox)内にあるurls.pyを参照し、 URLに応じてアプリフォルダ(この場合、accounts, mainapp)に振り分けられます。 このような仕組みのことを sandbox ルーティングと言います。 Django accounts urls.py urls.py リクエスト mainapp アプリフォルダ内のurls.pyは必須では urls.py ありませんが、アプリ内で完結してお くことで、アプリごと他のプロジェク トに移動することが可能になります。 33 © 2025 Hibiki Iwamoto All Rights Reserved
試してみよう① urls.pyの設定を変更し、動きがどのように変わるか見てみましょう。 ①mainapp/urls.pyを赤字の通り変更します。 urlpatterns = [ path('', index, name='index'), ] urlpatterns = [ ④ログイン画面からログインします。 http://localhost:8000/login/ ユーザー名 :admin パスワード:P@ssw0rd path('main/', index, name='index'), ] ②sandbox/settings.pyのLOGIN_REDIRECT_URLを 赤字の通り変更します。 ⑤ログインに成功し、URLがmainapp/main/となって います。 LOGIN_REDIRECT_URL = '/mainapp/' LOGIN_REDIRECT_URL = '/mainapp/main/' ③デバッグ実行を開始します。 34 © 2025 Hibiki Iwamoto All Rights Reserved
試してみよう② もう1つ別の例で、動きがどのように変わるか見てみましょう。 ①sandbox/urls.pyを赤字の通り変更します。 urlpatterns = [ ③ログイン画面にアクセスすると、エラーになります。 http://localhost:8000/login/ path('admin/', admin.site.urls), path('mainapp/', include('mainapp.urls'), name='mainapp'), path('', include('accounts.urls'), name='accounts'), ] urlpatterns = [ path('admin/', admin.site.urls), path('mainapp/', include('mainapp.urls'), name='mainapp'), path('sandbox/', include('accounts.urls'), name='accounts'), ] ②デバッグ実行を開始します。 ④下記URLにアクセスすると、ログイン画面が 表示されます。http://localhost:8000/sandbox/login/ 35 © 2025 Hibiki Iwamoto All Rights Reserved
03 変更要件解説 本章ではベースラインを基に、ユーザー認証機能を 拡張していきます。拡張の変更要件を通して、 Python+Djangoのプログラミングの基礎を 学んでいきます。 36 © 2025 Hibiki Iwamoto All Rights Reserved
変更要件の進め方 本章では、変更内容をソースコードと共に解説していきます。 ご自身のVS Codeでソースコードに変更を加えながら、内容を理解していってください。 import文など、解説をスキップしている箇所があります。 変更後のソースコードはGitHubに「solution」ブランチとして搭載してあります。 必要に応じて下記URLからGitHubを参照ください。 ◆GitHub URL https://github.com/hibiki-iwamoto/django-learn-auth01/tree/solution sandboxのリンクをクリックすると 本章で説明しているファイルが見つかります。 37 © 2025 Hibiki Iwamoto All Rights Reserved
基礎知識 本章では、pythonに関する下記の基礎知識が必要となります。 ご自身の知識レベルに応じて、巻末の「参考文献・サイト」を参照ください。 100%理解出来ていなくても、概要レベルが理解出来ていれば問題ありません。 Python 書き方の基本 変数と型 条件分岐 関数の書き方 モジュール、パッケージの基本 クラスの書き方 クラスの継承 例外処理 デコレータの基本 38 © 2025 Hibiki Iwamoto All Rights Reserved
変更要件 ログイン時にIDとして使用する項目として、ユーザー名からメールアドレスに変更します。 ページ上の文言を「ユーザー名」から「メール アドレス」に変更するだけでなく、プログラム 内部で認証に使用する項目も変更します。 39 © 2025 Hibiki Iwamoto All Rights Reserved
変更要件ブレークダウン 変更要件をブレークダウンすると、下記の通り4つの対応が必要となります。 また、ブレークダウンした要件ごとに編集対象のファイルを整理すると下表の通りとなります。 ログインIDにメール アドレス使用 No 詳細要件 accounts/ models.py ① DBにメールアドレスを追加し、 ユニーク項目に指定 ◯ ①-1 ② ユーザー作成メソッドを作成し、 メールアドレスに対応 ◯ ②-1 ③ ログイン画面に新しいユーザーモデルを設定 ④ 管理者機能に新しいユーザーモデルを追加 sandbox/ settings.py accounts/ admin.py ◯ ③-1 ◯ ④-1 40 © 2025 Hibiki Iwamoto All Rights Reserved
現在地確認 ①-1 次スライドから、①-1を解説していきます。 accounts/models.pyに対して、DBへのメールアドレス追加とユニーク項目指定を行っていきます。 No 詳細要件 accounts/ models.py ① DBにメールアドレスを追加し、 ユニーク項目に指定 ◯ ①-1 ② ユーザー作成メソッドを作成し、 メールアドレスに対応 ◯ ②-1 ③ ログイン画面に新しいユーザーモデルを設定 ④ 管理者機能に新しいユーザーモデルを追加 sandbox/ settings.py accounts/ admin.py ◯ ③-1 ◯ ④-1 41 © 2025 Hibiki Iwamoto All Rights Reserved
変更詳細 ①-1 DBにメールアドレスを追加し、 ユニーク項目に指定 accounts/ models.py Djangoでは、DBに関して慣習的に「models.py」に記述します。 認証に使用するユーザー情報もDB内にありますので、models.pyに記述することになります。 まずは、ユーザー情報として登録したい内容を整理しましょう。 「ユニーク」列は、同じ値が他に存在しないことを保証する設定です。 項目 フィールド名 型 サイズ ユニーク メールアドレス email メールアドレス型 255 ◯ ユーザー名 name 文字列型 150 - 有効フラグ is_active ブーリアン型 1 - 管理者フラグ is_admin ブーリアン型 1 - 42 © 2025 Hibiki Iwamoto All Rights Reserved
変更詳細 ①-1 DBにメールアドレスを追加し、 ユニーク項目に指定 accounts/ models.py ユーザー認証をカスタマイズする方法は、下記2種類があります。 ①AbstractBaseUserを継承したクラスを作成する方法 ②AbstractUserを継承したクラスを作成する方法 AbstractBaseUserを使用する方がより柔軟なカスタマイズが可能ですので、 本書では、「①AbstractBaseUserを継承したクラスを作成する方法」で進めていきます。 43 © 2025 Hibiki Iwamoto All Rights Reserved
変更詳細 ①-1 DBにメールアドレスを追加し、 ユニーク項目に指定 accounts/ models.py Userクラスのソースコードを基に、解説があるコードに番号を付けています。 (1) ソースコード No (2) (3) (4) (5) 概要 (1) AbstractBaseUserの継承 (2) Eメール型フィールドを定義 (3) 文字列型フィールドを定義 (4) ブーリアン型フィールドを定義 (5) カスタムマネージャの設定 (6) 認証用IDのフィールドを設定 (7) 必須フィールドを設定 (6) (7) 次スライドに続く... Noに付いている下線はリンクです。 クリックすることで対象のスライドに ジャンプできます。 44 © 2025 Hibiki Iwamoto All Rights Reserved
変更詳細 ①-1 DBにメールアドレスを追加し、 ユニーク項目に指定 accounts/ models.py Userクラスのソースコードを基に、解説があるコードに番号を付けています。 (8) ソースコード (9) (10) No 概要 (8) 特殊メソッドの定義 (9) アクションレベルの 権限チェックメソッドの定義 (10) アプリレベルの 権限チェックメソッドの定義 (11) デコレータによる プロパティ定義 (11) Noに付いている下線はリンクです。 クリックすることで対象のスライドに ジャンプできます。 次スライド以降、1つずつ解説します。 45 © 2025 Hibiki Iwamoto All Rights Reserved
①-1 変更詳細 No (1) DBにメールアドレスを追加し、 ユニーク項目に指定 概要 AbstractBaseUser, PermissionsMixinの継承 accounts/ models.py ソースコード class User(AbstractBaseUser, PermissionsMixin): ◆AbstractBaseUserクラスの継承 ◆PermissionsMixinクラスの継承 AbstractBaseUserは、パスワード管理、最終ログイン PermissionsMixinは、Djangoの権限システムと連携す 日時の記録といった認証に必要な最低限の機能のみを提 るための便利なメソッドを持っています。 供しています。 代表的なメソッドは、has_permと ユーザー名やメールアドレスなどのフィールドは持って has_module_permsです。 いませんので、自分で定義する必要があります。 メソッドの詳細は割愛しますが、ユーザーが権限を持っ 最低限の機能のみということは、裏を返すと大部分を ているかを確認するために使用されます。 カスタマイズ可能ということです。 このようにDjangoが提供する標準の認証機能とは異な る認証を実装したい場合にAbstractBaseUserを継承し ます。 46 © 2025 Hibiki Iwamoto All Rights Reserved
①-1 変更詳細 No (2) DBにメールアドレスを追加し、 ユニーク項目に指定 概要 Eメール型フィールドを定義 accounts/ models.py ソースコード email = models.EmailField( verbose_name='メールアドレス', max_length=255, unique=True,) ◆models.EmailField ◆verbose_nameオプション メールアドレスのフィールドを作成します。 人間が読みやすい名前を付けます。 DB内では単純な文字列として保持されますが、 Djangoの管理画面などで使用されます。 EmailFieldを指定しておくことで、メールアドレスとし ◆max_lengthオプション(必須) て妥当な形式であるかというチェックをDjangoが自動 最大文字数を指定します。255文字は通常、 的に行なってくれるようになります。 メールアドレスを保持するのに十分な長さです。 ◆uniqueオプション Trueに設定することで同じメールアドレスを複数 登録することは出来なくなります。メールアドレスを IDとするために重複が無いようにTrueに設定します。 47 © 2025 Hibiki Iwamoto All Rights Reserved
①-1 変更詳細 DBにメールアドレスを追加し、 ユニーク項目に指定 accounts/ models.py No 概要 ソースコード (3) 文字列型フィールドを定義 name = models.CharField(max_length=150, verbose_name='ユーザー名') ◆models.CharField ◆verbose_nameオプション 文字列のフィールドを作成します。 人間が読みやすい名前を付けます。 最大の文字数がある程度決まっている文字列情報を格納 Djangoの管理画面などで使用されます。 する際に使用されます。 ◆max_lengthオプション(必須) 最大文字数を指定します。 一方、ブログ記事のように最大文字数を定義しにくい情 報は、CharFieldではなく、TextFieldの使用が一般的で す。 48 © 2025 Hibiki Iwamoto All Rights Reserved
①-1 変更詳細 No 概要 (4) ブーリアン型フィールドを 定義 DBにメールアドレスを追加し、 ユニーク項目に指定 accounts/ models.py ソースコード is_active = models.BooleanField(default=True, verbose_name='有効') ◆models.BooleanField ◆verbose_nameオプション 真偽値のフィールドを作成します。 人間が読みやすい名前を付けます。 真(True)か偽(False)のいずれかしか保持出来ません。 Djangoの管理画面などで使用されます。 ◆defaultオプション 値を指定しなかった場合のデフォルト値を設定 します。 49 © 2025 Hibiki Iwamoto All Rights Reserved
①-1 変更詳細 No 概要 (5) カスタムマネージャの設定 DBにメールアドレスを追加し、 ユニーク項目に指定 accounts/ models.py ソースコード objects = UserManager() ◆カスタムマネージャ 後述するUserManagerクラスをカスタムマネージャと して設定しています。 Djangoにおいてマネージャとは、ユーザーからの入力 値をDBに登録する等、DBとのインタフェースを提供す るクラスのことです。 Userクラスを使用してDBにデータ登録する機能などを 提供するクラスを指定します。 50 © 2025 Hibiki Iwamoto All Rights Reserved
①-1 変更詳細 No 概要 (6) 認証用IDのフィールドを設定 DBにメールアドレスを追加し、 ユニーク項目に指定 accounts/ models.py ソースコード USERNAME_FIELD = 'email' ◆USERNAME_FIELDについて USERNAME_FIELDは、Djangoにおいてユーザーを一 意に識別するためのフィールドを指定するものです。 つまり、「email」を設定することで、ログイン時のID をユーザー名からメールアドレスに変更しています。 51 © 2025 Hibiki Iwamoto All Rights Reserved
①-1 変更詳細 No (7) DBにメールアドレスを追加し、 ユニーク項目に指定 accounts/ models.py 概要 必須フィールドを設定 ソースコード REQUIRED_FIELDS = ['name'] ◆REQUIRED_FIELDSについて ◆REQUIRED_FIELDSに指定可能なフィールドの条件 REQUIRED_FIELDSは、Djangoの管理コマンドを実行 下記条件を満たすフィールドをREQUIRE_FIELDSに指定 して、管理者ユーザーを作成する際に入力を求める項目 可能です。 を指定するものです。 ・blank=Falseであること(空を許容しない) 「name」の指定により、管理コマンドから管理者ユー ・USERNAME_FIELDで指定されていない項目であること ザーを作成する際にユーザー名の入力が求められます。 ・パスワードではないこと 「REQUIRED_FIELDS」と複数形になっていることに 注意が必要です。上記例では1項目のみですが、カンマ 区切りで複数項目を指定可能です。 52 © 2025 Hibiki Iwamoto All Rights Reserved
①-1 変更詳細 No (8) DBにメールアドレスを追加し、 ユニーク項目に指定 概要 特殊メソッドの定義 accounts/ models.py ソースコード def __str__(self): return self.email ◆特殊メソッド __str__メソッドについて ◆Djangoにおける役割 Pythonのクラスにおける特殊メソッド(または「マジ Djangoでは、管理画面でユーザーを一覧表示する時に、 ックメソッド」とも呼ばれます)の1つです。 このメソッドを呼び出します。管理者は、ユーザーをメー __str__メソッドは、print関数でオブジェクトを直接出 ルアドレスで識別できるようになります。 力する時などに呼び出されます。 53 © 2025 Hibiki Iwamoto All Rights Reserved
①-1 変更詳細 No 概要 (9) アクションレベルの 権限チェックメソッドの定義 DBにメールアドレスを追加し、 ユニーク項目に指定 accounts/ models.py ソースコード def has_perm(self, perm, obj=None): return True ◆has_permメソッドの役割 ◆実装内容 ユーザーが特定の「アクション」を実行する権限を持っ 今回の変更要件では、細かな権限制御を求めていませんの ているかをチェックします。Djangoによって呼び出さ で、常にTrueを返すことで、カスタムユーザーモデルを使 れます。 用するすべてのユーザーが、どのようなパーミッションが 例えば、user.has_perm('myapp.add_mymodel') の チェックされても、常にそのパーミッションを持っている ように呼び出され、アクションを許可する場合はTrue、 とみなされることを意味します。 許可しない場合はFalseを返します。 54 © 2025 Hibiki Iwamoto All Rights Reserved
①-1 変更詳細 No 概要 (10) アプリレベルの 権限チェックメソッドの定義 DBにメールアドレスを追加し、 ユニーク項目に指定 accounts/ models.py ソースコード def has_module_perms(self, app_label): return True ◆has_module_permsメソッドの役割 ◆実装内容 ユーザーが特定のアプリ内のモデルにアクセスする権限 今回の変更要件では、細かな権限制御を求めていませんの を持っているかをチェックします。 で、常にTrueを返すことで、すべてのユーザーが、すべて アプリレベルでの権限チェックですので、has_permメ のアプリケーションのモデルにアクセスできるとみなされ ソッドに比べると粗い粒度での権限チェックになりま ることを意味します。 す。 特定のアプリへのアクセスを許可する場合はTrue、許可 しない場合はFalseを返します。 55 © 2025 Hibiki Iwamoto All Rights Reserved
①-1 変更詳細 No (11) DBにメールアドレスを追加し、 ユニーク項目に指定 accounts/ models.py 概要 デコレータによるプロパテ ィ定義 ソースコード @property def is_staff(self): return self.is_admin ◆デコレータ「@property」について ◆is_staffの役割 メソッドをクラスの属性(プロパティ)のように呼び出 Djangoのユーザーモデルにおいて、is_staff はそのユーザ せるようにするためのPythonの機能です。 ーがDjangoの管理画面にアクセスする権限を持っている これにより、user.is_staff() のように()をつけてメソッ かどうかを判定するために使用されます。 ドとして呼び出すのではなく、user.is_staff のようにイ Trueを返すとそのユーザーは管理画面にアクセスできま ンスタンス変数と同じアクセスが可能となります。 す。 56 © 2025 Hibiki Iwamoto All Rights Reserved
現在地確認 ②-1 次スライドから、②-1を解説していきます。 accounts/models.pyに対して、ユーザー作成メソッドを追加していきます。 models.pyにはDB定義だけでなく、DB操作のメソッドも定義します。 No 詳細要件 accounts/ models.py ① DBにメールアドレスを追加し、 ユニーク項目に指定 ◯ ①-1 ② ユーザー作成メソッドを作成し、 メールアドレスに対応 ◯ ②-1 ③ ログイン画面に新しいユーザーモデルを設定 ④ 管理者機能に新しいユーザーモデルを追加 sandbox/ settings.py accounts/ admin.py ◯ ③-1 ◯ ④-1 57 © 2025 Hibiki Iwamoto All Rights Reserved
変更詳細 ②-1 ユーザー作成メソッドを作成し、 メールアドレスに対応 accounts/ models.py Userクラスの操作を提供するUserManagerクラスのソースコードを基に、 解説があるコードに番号を付けています。 (1) ソースコード No (2) (3) (4) (5) (6) 次スライドに続く... 概要 (1) BaseUserManagerの継承 (2) ユーザー作成メソッド (3) メールアドレスの検証 (4) ユーザー登録情報生成 (5) パスワード設定 (6) DB保存 Noに付いている下線はリンクです。 クリックすることで対象のスライドに ジャンプできます。 58 © 2025 Hibiki Iwamoto All Rights Reserved
変更詳細 ②-1 ユーザー作成メソッドを作成し、 メールアドレスに対応 accounts/ models.py Userクラスの操作を提供するUserManagerクラスのソースコードを基に、 解説があるコードに番号を付けています。 (7) ソースコード (8) (9) (10) No 概要 (7) 管理者ユーザー作成メソッド (8) ユーザー作成メソッド呼び出し (9) 管理者フラグ設定 (10) DB保存 Noに付いている下線はリンクです。 クリックすることで対象のスライドに ジャンプできます。 次スライド以降、1つずつ解説します。 59 © 2025 Hibiki Iwamoto All Rights Reserved
②-1 変更詳細 No (1) ユーザー作成メソッドを作成し、 メールアドレスに対応 accounts/ models.py 概要 BaseUserManagerの継承 ソースコード class UserManager(BaseUserManager): ◆UserManagerクラスの役割 ◆BaseUserManagerクラスの継承 create_userメソッドとcreate_superuserメソッドに UserManagerは、スーパークラスとして て、一般ユーザーや管理者ユーザーを作成する手段を BaseUserManagerを継承しています。 提供します。 BaseUserManagerには、カスタムマネージャとして必要 なメソッドや便利なヘルパーメソッドが定義されていま す。 60 © 2025 Hibiki Iwamoto All Rights Reserved
②-1 変更詳細 No (2) ユーザー作成メソッドを作成し、 メールアドレスに対応 概要 ユーザー作成メソッド accounts/ models.py ソースコード def create_user(self, email, name, password=None): ◆create_userメソッド ◆引数 email, name, passwordについて カスタムユーザーマネージャとして実装が必須であるメ 今回のカスタムユーザーモデルでは、メールアドレス、 ソッドの1つです。 ユーザー名、パスワードの3つの情報を持ちますので、 全て引数で受け取ります。 パスワードはデフォルト値「None」が指定されています ので、省略可能です。 61 © 2025 Hibiki Iwamoto All Rights Reserved
②-1 変更詳細 No (3) ユーザー作成メソッドを作成し、 メールアドレスに対応 概要 メールアドレスの検証 accounts/ models.py ソースコード if not email: raise ValueError('メールアドレスは必須です') ◆メールアドレスの入力有無チェック ◆メールアドレス形式のチェックについて 変数「email」が空やNoneであった場合、if文の中の処 ここではメールアドレスが入力されたかどうかしかチェッ 理が実行され、例外が発生します。 クしていません。 つまり、ユーザーがメールアドレスを入力しなかった場 メールアドレス形式であるかどうかは、前述の「Eメール 合にここで指定したエラーメッセージが表示されます。 型フィールドを定義」でEmailFieldを指定することで、チ ェックされます。 62 © 2025 Hibiki Iwamoto All Rights Reserved
②-1 変更詳細 No (4) ユーザー作成メソッドを作成し、 メールアドレスに対応 概要 ユーザー登録情報生成 accounts/ models.py ソースコード user = self.model( email=self.normalize_email(email), name=name, ) ◆Userインスタンスの生成 ◆メールアドレスの正規化 メールアドレスとユーザー名を使用して、Userクラスの normalize_emailメソッド内では、メールアドレスのドメ インスタンスを生成します。 イン部分を小文字に変換しています。これは、メールアド レスの仕様として、ドメイン部分は大文字/小文字を区別 しないことになっているためです。 メールアドレスでは、[email protected]と[email protected] は同じアドレスとして認識されます。 63 © 2025 Hibiki Iwamoto All Rights Reserved
②-1 変更詳細 No (5) ユーザー作成メソッドを作成し、 メールアドレスに対応 accounts/ models.py 概要 パスワード設定 ソースコード user.set_password(password) ◆set_passwordメソッドについて ◆ハッシュ化と暗号化の違い ユーザーが入力したパスワードをハッシュ化していま ハッシュ化とは平文→暗号文字列の一方向です。 す。 一方、暗号化では復号化して、元の文字列を取り出すこと ハッシュ化のアルゴリズムは、settings.py の が可能です。 PASSWORD_HASHERS リストで定義されます。 通常、パスワードはハッシュ化しておくことで安全性を確 PASSWORD_HASHERS リストの先頭に定義したアル 保します。 ゴリズムでハッシュ化が行われます。 64 © 2025 Hibiki Iwamoto All Rights Reserved
②-1 変更詳細 No (6) ユーザー作成メソッドを作成し、 メールアドレスに対応 accounts/ models.py 概要 DB保存 ソースコード user.save(using=self._db) ◆saveメソッドについて ◆引数 self._db について saveメソッドを呼び出すことで、DBにデータを保存し ユーザー情報の登録先のDBを指定しています。 ます。ここでは、ユーザーをDBに登録します。 self._dbにはsettings.pyのDATABASESで指定している 未登録のユーザーの場合は新規作成、既存ユーザーの場 DBが登録されています。 合は更新します。 65 © 2025 Hibiki Iwamoto All Rights Reserved
②-1 変更詳細 No 概要 (7) 管理者ユーザー作成メソッド ユーザー作成メソッドを作成し、 メールアドレスに対応 accounts/ models.py ソースコード def create_superuser(self, email, name, password=None): ◆create_superuserメソッド ◆引数 email, name, passwordについて カスタムユーザーマネージャとして実装が必須であるメ 今回のカスタムユーザーモデルでは、メールアドレス、 ソッドの1つです。 ユーザー名、パスワードの3つの情報を持ちますので、 全て引数で受け取ります。 パスワードはデフォルト値「None」が指定されています ので、省略可能です。 66 © 2025 Hibiki Iwamoto All Rights Reserved
②-1 変更詳細 No (8) ユーザー作成メソッドを作成し、 メールアドレスに対応 概要 ユーザー作成メソッド呼び出 し accounts/ models.py ソースコード user = self.create_user( email=email, name=name, password=password,) ◆create_userメソッド呼び出し 一般ユーザー作成用に用意したメソッドを呼び出します。 メールアドレス、ユーザー名、パスワードは一般ユーザーで も管理者ユーザーでも同じであるため、create_userメソッ ドを呼び出しています。 67 © 2025 Hibiki Iwamoto All Rights Reserved
②-1 変更詳細 No 概要 (9) 管理者フラグ設定 ユーザー作成メソッドを作成し、 メールアドレスに対応 accounts/ models.py ソースコード user.is_admin = True ◆管理者フラグ is_adminにTrueを代入し、管理者であることを示して います。 68 © 2025 Hibiki Iwamoto All Rights Reserved
②-1 変更詳細 No (10) ユーザー作成メソッドを作成し、 メールアドレスに対応 概要 DB保存 accounts/ models.py ソースコード user.save(using=self._db) 内容は一般ユーザー作成用で説明したものと同じです。 「(6) DB保存」参照。 69 © 2025 Hibiki Iwamoto All Rights Reserved
現在地確認 ③-1 次スライドから、③-1を解説していきます。 sandbox/settings.pyに対して、新しいユーザーモデルを設定していきます。 settings.pyは、プロジェクト全体の設定を行うファイルであり、ユーザーモデルの設定も行います。 No 詳細要件 accounts/ models.py ① DBにメールアドレスを追加し、 ユニーク項目に指定 ◯ ①-1 ② ユーザー作成メソッドを作成し、 メールアドレスに対応 ◯ ②-1 ③ ログイン画面に新しいユーザーモデルを設定 ④ 管理者機能に新しいユーザーモデルを追加 sandbox/ settings.py accounts/ admin.py ◯ ③-1 ◯ ④-1 70 © 2025 Hibiki Iwamoto All Rights Reserved
変更詳細 ③-1 ログイン画面に 新しいユーザーモデルを設定 sandbox/ settings.py プロジェクト全体の設定を行うsettings.pyのソースコードの中で、ユーザーモデル変更に関係する 部分のみ示しています。 ソースコード (1) No 概要 (1) カスタムユーザーモデルとして使用するクラスを指定します。 「accounts.User」は、accountsアプリ内に定義された Userクラスをユーザー認証に使用することを示しています。 71 © 2025 Hibiki Iwamoto All Rights Reserved
DBへの変更反映 1/3 ユーザーモデルの変更は通常、最初のマイグレーション(DB作成)の前に実行するのが正しい手順であり、 強く推奨されています。 しかし、本書ではベースラインでの動きを見て頂くために、ユーザーモデルを変更する前にDBを作成しています。 そこでユーザーモデルの変更にあたって、一度DBを削除して、再作成します。 (DB再作成が必要なのは、settings.pyでAUTH_USER_MODELを変更した時のいです) 72 © 2025 Hibiki Iwamoto All Rights Reserved
DBへの変更反映 2/3 DB削除は下記の手順で行います。 ① VS Codeにて「表示」メニュー - 「ターミナル」を選択(または、Ctrl + @)し、ターミナルを開きます。 ② ターミナル上で下記の順でコマンドを実行します。 (日本語入力をOFFにし、すべて半角で入力してください) (1) (3) (4) No (1) コマンド (2) 説明 cd sandbox/ sandboxフォルダに移動します。 (2) find . -path "*/migrations/*.py" -not -name "__init__.py" -delete migrationフォルダ内の.pyファイルを削除します。 __init__.pyは除く。 (3) find . -path "*/migrations/*.pyc" -delete migrationフォルダ内の.pycファイルを削除します。 (4) find . -name 'db.sqlite3' -delete 73 db.sqlite3を削除します。 © 2025 Hibiki Iwamoto All Rights Reserved
DBへの変更反映 3/3 DB再作成は下記手順で行います。 DB再作成だけでなく、models.pyに加えた変更をDBに反映させる手順は同じです。 ① VS Codeにて「表示」メニュー - 「ターミナル」を選択(または、Ctrl + @)し、ターミナルを開きます。 (すでにターミナルを開いている場合はスキップ可能です) ② ターミナル上で下記の順でコマンドを実行します。 (日本語入力をOFFにし、すべて半角で入力してください) No コマンド (1) (2) (3) 説明 (1) cd sandbox/ sandboxフォルダに移動し ます。(移動済みの場合は スキップ) (2) python manage.py makemigrations DBへの変更反映用ファイル を生成します。 (3) python manage.py migrate DBへ変更を反映します。 74 © 2025 Hibiki Iwamoto All Rights Reserved
現在地確認 ④-1 次スライドから、④-1を解説していきます。 accounts/admin.pyに対して、管理者機能への新しいユーザーモデル追加を行っていきます。 admin.pyは、管理機能への変更を定義するファイルです。 No 詳細要件 accounts/ models.py ① DBにメールアドレスを追加し、 ユニーク項目に指定 ◯ ①-1 ② ユーザー作成メソッドを作成し、 メールアドレスに対応 ◯ ②-1 ③ ログイン画面に新しいユーザーモデルを設定 ④ 管理者機能に新しいユーザーモデルを追加 sandbox/ settings.py accounts/ admin.py ◯ ③-1 ◯ ④-1 75 © 2025 Hibiki Iwamoto All Rights Reserved
変更詳細 ④-1 管理者機能に新しい ユーザーモデルを追加 accounts/ admin.py 管理機能への変更を定義するadmin.pyのソースコードを基に、解説があるコードに番号を付けています。 ソースコード (1) 次スライドに続く... No 概要 (1) 前述したUserクラスをインポートします。 詳細説明は割愛します。 Noに付いている下線はリンクです。 クリックすることで対象のスライドに ジャンプできます。 76 © 2025 Hibiki Iwamoto All Rights Reserved
変更詳細 ④-1 管理者機能に新しい ユーザーモデルを追加 accounts/ admin.py 管理機能への変更を定義するadmin.pyのソースコードを基に、解説があるコードに番号を付けています。 (2) ソースコード No (3) (4) 概要 (2) ユーザー登録フォームの定義 (3) パスワード項目の設定 (4) Metaクラスの定義 (5) パスワード確認メソッドの定義 (6) 入力されたパスワードの取得 (7) エラー時の例外発生、成功時の戻り値 (5) (6) Noに付いている下線はリンクです。 クリックすることで対象のスライドに ジャンプできます。 (7) 77 次スライドに続く... © 2025 Hibiki Iwamoto All Rights Reserved
変更詳細 ④-1 管理者機能に新しい ユーザーモデルを追加 accounts/ admin.py 管理機能への変更を定義するadmin.pyのソースコードを基に、解説があるコードに番号を付けています。 (8) ソースコード No (8) 概要 ユーザー情報保管メソッドの定義 Noに付いている下線はリンクです。 クリックすることで対象のスライドに ジャンプできます。 次スライドに続く... 78 © 2025 Hibiki Iwamoto All Rights Reserved
変更詳細 ④-1 管理者機能に新しい ユーザーモデルを追加 accounts/ admin.py 管理機能への変更を定義するadmin.pyのソースコードを基に、解説があるコードに番号を付けています。 (9) ソースコード (10) (11) No 概要 (9) ユーザー更新フォームの定義 説明は(2) ユーザー登録フォームの定義と同 じであるため割愛します。 (10) パスワード項目の設定 (11) フォーム上への表示項目の定義 説明は(4) Metaクラスの定義と同じであるた め割愛します。 次スライドに続く... Noに付いている下線はリンクです。 クリックすることで対象のスライドに ジャンプできます。 79 © 2025 Hibiki Iwamoto All Rights Reserved
変更詳細 ④-1 管理者機能に新しい ユーザーモデルを追加 accounts/ admin.py 管理機能への変更を定義するadmin.pyのソースコードを基に、解説があるコードに番号を付けています。 (12) ソースコード No (13) (14) 概要 (12) 管理画面の定義 (13) ユーザー登録フォーム、ユーザー更新フォー ムの設定 (14) 一覧表示項目、非表示項目の定義 (15) ユーザー更新フォーム上の項目配置の定義 (16) ユーザー登録フォーム上の項目配置の定義 (17) 検索可能項目、ソート項目の定義 (15) (16) (17) 次スライドに続く... Noに付いている下線はリンクです。 クリックすることで対象のスライドに ジャンプできます。 80 © 2025 Hibiki Iwamoto All Rights Reserved
変更詳細 ④-1 管理者機能に新しい ユーザーモデルを追加 accounts/ admin.py 管理機能への変更を定義するadmin.pyのソースコードを基に、解説があるコードに番号を付けています。 ソースコード (18) No (18) 概要 管理画面上で操作可能なモデルの設定 Noに付いている下線はリンクです。 クリックすることで対象のスライドに ジャンプできます。 次スライド以降、1つずつ解説します。 81 © 2025 Hibiki Iwamoto All Rights Reserved
④-1 変更詳細 No 概要 (2) ユーザー登録フォームの定義 管理者機能に新しい ユーザーモデルを追加 accounts/ admin.py ソースコード class UserCreationForm(forms.ModelForm): ◆forms.ModelFormについて 3)バリデーションの自動化: モデルのフィールドに設定さ Django のフォーム機能の一部であり、以下のような特 れた制約は、フォームのバリデーションにも自動的に適用 徴があります。 されます。 1) コード量の削減: モデルのフィールド定義に基づいて 4)DB操作の簡素化: save() メソッドの使用で、フォーム フォームが自動生成されるため、コード量を大幅に削減 から取得したデータを簡単にDBに保存できます。 できます。 2)モデルとの同期: モデルのフィールドを変更した場 合、ModelForm も自動的に更新されます。 82 © 2025 Hibiki Iwamoto All Rights Reserved
④-1 変更詳細 No (3) 管理者機能に新しい ユーザーモデルを追加 概要 パスワード項目の設定 accounts/ admin.py ソースコード password1 = forms.CharField(label='パスワード', widget=forms.PasswordInput) password2 = forms.CharField(label='パスワード(再)', widget=forms.PasswordInput) ◆forms.CharFieldについて ◆labelオプション Django の forms モジュールで提供されるフォームフ 画面上に表示する項目名です。 ィールドクラスです。CharField は、テキストデータを 扱うための基本的なフィールドです。 ◆widgetオプション 今回はパスワード入力フィールドに使用しています。 HTMLでどのようにフィールドを表示するかを決定しま す。forms.PasswordInputはパスワードを入力するため のウィジェットです。入力値が*などで隠されます。 83 © 2025 Hibiki Iwamoto All Rights Reserved
④-1 変更詳細 No (4) 管理者機能に新しい ユーザーモデルを追加 accounts/ admin.py 概要 Metaクラスの定義 ソースコード class Meta: model = User fields = ('email', 'name') ◆Metaクラスについて ◆model, fieldsへの設定 Metaクラスは、UserCreationFormクラスにおいて、フ modelには、どのモデルを使用するかを指定します。 ォーム上で使用するモデルやフィールドを指定するため この場合、前述したUserクラスをモデルとして使用 に使われます。 します。 fieldsには、フォーム上に含めるフィールドを指定 します。「‘__all__’」と記述すると、モデル内の 全フィールドが含まれるようになります。 84 © 2025 Hibiki Iwamoto All Rights Reserved
管理者機能に新しい ユーザーモデルを追加 ④-1 変更詳細 No 概要 (5) パスワード確認メソッドの定 義 accounts/ admin.py ソースコード def clean_password2(self): ◆clean_password2について Djangoのフォーム処理では、clean_フィールド名 と いう名前のメソッドを定義することで、特定のフィール ドの検証ロジックを実装できます。 当該メソッドは、パスワード再入力フィールドの入力値 に対する検証を定義するものです。 85 © 2025 Hibiki Iwamoto All Rights Reserved
④-1 変更詳細 No (6) 管理者機能に新しい ユーザーモデルを追加 概要 入力されたパスワードの取得 accounts/ admin.py ソースコード password1 = self.cleaned_data.get("password1") password2 = self.cleaned_data.get("password2") ◆self.cleaned_dataについて ◆パスワード再入力項目の検証済みの値 self.cleaned_data は、フォームが送信された後に、検 パスワード再入力(password2)項目の検証済みの値には、 証済みの入力値が格納される辞書です。 clean_password2の戻り値がセットされます。 そのため、clean_password2の中で実行する 「self.cleaned_data.get("password2")」は、未検証の 値を返します。 86 © 2025 Hibiki Iwamoto All Rights Reserved
④-1 変更詳細 No (7) 管理者機能に新しい ユーザーモデルを追加 概要 エラー時の例外発生、成功時 の戻り値 accounts/ admin.py ソースコード if password1 and password2 and password1 != password2: raise ValidationError("パスワードが一致しません") return password2 ◆検証エラー時 ◆検証成功時 clean_フィールド名で定義した検証メソッドにて、検 検証が成功した場合は、クリーンアップした値を返しま 証エラーとなった場合は、ValidationError例外を発生 す。当該のコードではクリーンアップは不要であるため、 させます。 生の値を返していますが、必要に応じて下記クリーンアッ プを行うことがあります。 ValidationErrorの引数は文字列(エラーメッセージ)で ・文字列の前後の空白を削除する す。複数のメッセージがある場合はリストで渡すことも ・データを適切な型に変換する 可能です。 ・データを正規化する 87 © 2025 Hibiki Iwamoto All Rights Reserved
④-1 変更詳細 No (8) 管理者機能に新しい ユーザーモデルを追加 概要 ユーザー情報保管メソッドの 定義 accounts/ admin.py ソースコード def save(self, commit=True): user = super().save(commit=False) user.set_password(self.cleaned_data["password1"]) if commit: user.save() return user ◆saveメソッドについて 当該メソッドは、フォームのデータをDBに保存する処 すが、まだDBに保存していません。(commit=Falseのため) 理をオーバーライドしています。 下から2行目の user.save()メソッドにてDBに保存します。 super().save()メソッドにて、スーパークラス 最後にUserインスタンスを返します。 (forms.ModelForm)のsaveメソッドを呼び出していま 88 © 2025 Hibiki Iwamoto All Rights Reserved
④-1 変更詳細 No (10) 管理者機能に新しい ユーザーモデルを追加 概要 パスワード項目の設定 accounts/ admin.py ソースコード password = ReadOnlyPasswordHashField() ◆ReadOnlyPasswordHashFieldについて ReadOnlyPasswordHashField は、Django の forms Djangoでは、パスワード変更はユーザー更新フォームで モジュールで提供されるカスタムフィールドです。これ はなく、パスワード変更画面にて行うようになっているた は、ユーザーのパスワードハッシュを表示するものの、 め、ここでは読取専用フィールドとして表示しています。 編集はできないようにするための特別なフィールドで す。 89 © 2025 Hibiki Iwamoto All Rights Reserved
④-1 変更詳細 No (12) 管理者機能に新しい ユーザーモデルを追加 概要 管理画面の定義 accounts/ admin.py ソースコード class UserAdmin(BaseUserAdmin): ◆UserAdminクラスの役割 ◆BaseUserAdminの継承 Django の管理画面における User モデルの表示や操作 BaseUserAdminを継承することで、Userモデルを管理画 をどのように行うかを定義するためのものです。 面で扱うための基本的な機能を利用できます。 ・基本的なフォーム処理 ・パスワードの安全な処理 ・認証と認可の管理 ・基本的な表示設定 ・フィールドセットの構成 90 © 2025 Hibiki Iwamoto All Rights Reserved
管理者機能に新しい ユーザーモデルを追加 ④-1 変更詳細 No 概要 (13) ユーザー登録フォーム、ユー ザー更新フォームの設定 accounts/ admin.py ソースコード form = UserChangeForm add_form = UserCreationForm ◆フォームの登録 前述したUserCreationFormとUserChangeFormを設定 します。 formにUserChangeFormをセットすることで、ユーザ ー更新フォームとして利用できます。 add_formにUserCreationFormをセットすることで、 ユーザー登録フォームとして利用できます。 91 © 2025 Hibiki Iwamoto All Rights Reserved
④-1 変更詳細 No 概要 (14) 一覧表示項目、非表示項目の 定義 管理者機能に新しい ユーザーモデルを追加 accounts/ admin.py ソースコード list_display = ('email', 'name', 'is_active', 'is_admin') list_filter = ('is_admin',) ◆list_displayについて ◆list_filterについて list_displayには、一覧表示の列に使用する項目を指定 一覧表示にてフィルター機能を追加します。 します。 is_adminを指定することで、管理者フラグにて一覧をフ 上記の通り設定することで、下記項目が表示されます。 ィルター表示することが可能です。 ・メールアドレス ・ユーザー名 ・有効フラグ ・管理者フラグ 92 © 2025 Hibiki Iwamoto All Rights Reserved
④-1
変更詳細
No
(15)
管理者機能に新しい
ユーザーモデルを追加
概要
ユーザー更新フォーム上の
項目配置の定義
accounts/
admin.py
ソースコード
fieldsets = (
(None, {'fields': ('email', 'password')}),
('ユーザー名', {'fields': ('name',)}),
('権限', {'fields': ('is_admin',)}),
)
◆fieldsetsについて
◆タプルの内容
ユーザー更新フォームでのフィールドの表示方法を定義
各タプルは次の2つの要素を持ちます。
します。フィールドを論理的なグループに分け、見出し
1) フィールドセットのタイトル (文字列または None)
をつけて表示できます。
2) フィールドセットのオプション (辞書)
フォーマットは、タプルのリストで指定します。
fields:含めるフィールド名のタプル
各タプルは1つのフィールドセットを表します。
他にもclassesやdescriptionを指定可能です。
93
© 2025 Hibiki Iwamoto All Rights Reserved
④-1
変更詳細
No
(16)
管理者機能に新しい
ユーザーモデルを追加
概要
ユーザー登録フォーム上の
項目配置の定義
accounts/
admin.py
ソースコード
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('email', 'name', 'password1', 'password2'),
}),
)
◆add_fieldsetsについて
ユーザー登録フォームでのフィールドの表示方法を定義
します。定義方法は、fieldsetsと同じです。
94
© 2025 Hibiki Iwamoto All Rights Reserved
④-1 変更詳細 No (17) 管理者機能に新しい ユーザーモデルを追加 概要 検索可能項目、ソート項目の 定義 accounts/ admin.py ソースコード search_fields = ('email',) ordering = ('email',) filter_horizontal = () ◆search_fieldsについて ◆filter_horizontalについて ユーザー一覧画面に検索ボックスを追加し、メールアド 多対多のフィールドを水平方向に表示するための設定で レスのフィールドで検索できるようにします。 す。今回はそのようなフィールドは無いので、空となって います。 ◆orderingについて ユーザーの一覧を、メールアドレスのフィールドで並び 替えられるようにします。 95 © 2025 Hibiki Iwamoto All Rights Reserved
④-1 変更詳細 No 概要 (18) 管理画面上で操作可能なモデ ルの設定 管理者機能に新しい ユーザーモデルを追加 accounts/ admin.py ソースコード admin.site.register(User, UserAdmin) admin.site.unregister(Group) ◆registerメソッドについて ◆unregisterメソッドについて Djangoの管理画面に、Userモデルを登録し、管理方法 Djangoの管理画面から、Groupモデルを登録解除するた をUserAdminクラスで指定するためのものです。 めのものです。 registerメソッドを使用することで、管理画面上にカス タムユーザーモデルが表示されるようになります。 96 © 2025 Hibiki Iwamoto All Rights Reserved
04 動作検証 お疲れさまでした。実装は以上です。 本章では動作検証を行っていきます。 97 © 2025 Hibiki Iwamoto All Rights Reserved
準備作業 今回はユーザーモデルを変更したため、baselineで使用していたadminユーザーは使えません。 新規に管理者ユーザーを作成する必要があります。まずは下記手順で管理者ユーザーを登録してください。 ① VS Codeにて「表示」メニュー - 「ターミナル」を選択(または、Ctrl + @)し、ターミナルを開きます。 ② ターミナル上で下記の順でコマンドを実行します。 (日本語入力はOFFにし、すべて半角で入力してください) (1) (2) メールアドレス ユーザー名 No コマンド パスワード × 2回 説明 (1) cd sandbox/ sandboxフォルダに移 動します。 (2) python manage.py createsuperuser 指示に従い、管理者ユ ーザーの情報を入力し ます。 98 © 2025 Hibiki Iwamoto All Rights Reserved
動作検証 - ケース一覧 1/5 次のケースに基づき、期待する結果通りになるか動作検証してみましょう。 No 画面 操作 期待する結果 (1) ログイン画面 1.メールアドレス、パスワードを入力 2.ログインボタンを押下 (2) メインページ 1.ログアウトボタンを押下 ログイン画面に戻る ログイン画面 1.メールアドレスにユーザー名を入力 2.パスワードを入力 3.ログインボタンを押下 エラーメッセージが表示される ログイン画面が再度表示される createsuperuserコマンドでの 作成時に入力したユーザー名を 使用 管理者ログイン 画面 1.管理者ユーザーのメールアドレス、 パスワードを入力 2.ログインボタンを押下 管理ホーム画面が表示される createsuperuserコマンドにて 作成したアカウントを使用 (3) (4) メインページが表示される 備考 createsuperuserコマンドにて 作成したアカウントを使用 99 © 2025 Hibiki Iwamoto All Rights Reserved
動作検証 - ケース一覧 2/5 次のケースに基づき、期待する結果通りになるか動作検証してみましょう。 No (5) (6) (7) 画面 ユーザー登録 画面 ユーザー登録 画面 ユーザー更新 画面 操作 期待する結果 備考 1.管理者ホーム画面にて「Users」の 追加リンクをクリック ユーザー登録画面が表示される 上から順に、メールアドレス、ユー ザー名、パスワード、パスワード (再)が表示される 1.メールアドレス、ユーザー名、パス ワード×2回を入力 2.保存ボタンを押下 追加成功メッセージが画面上部に表 示される ユーザー更新画面が表示される 追加したユーザー情報がセットされ ている 1.管理者ホーム画面にて「Users」リ ンクをクリック 2.ユーザー一覧画面にて追加したユー ザーのメールアドレスをクリック ユーザー更新画面が表示される 上から順に、メールアドレス、パス ワード、ユーザー名、管理者権限が 表示される パスワードは読取専用になっている 100 © 2025 Hibiki Iwamoto All Rights Reserved
動作検証 - ケース一覧 3/5 次のケースに基づき、期待する結果通りになるか動作検証してみましょう。 No (8) (9) (10) (11) 画面 ユーザー更新 画面 ユーザー更新 画面 ユーザー一覧 画面 ユーザー一覧 画面 操作 期待する結果 備考 1.メールアドレスを、他の登録済みの アドレスに変更 2.保存ボタンを押下 エラーメッセージが表示されること ユーザー更新画面が表示されること 1.ユーザー名を変更 2.保存ボタンを押下 変更成功メッセージが画面上部に表 示される ユーザー一覧画面が表示される 一覧上に変更されたユーザー名が表 示されている 1.管理者ホーム画面にて「Users」リ ンクをクリック 一覧の列として、左からメールアド レス、ユーザー名、有効、管理者と なっている 1.検索ボックスに登録済みのメールア ドレスを入力 2.検索ボタンを押下 メールアドレスに一致したユーザー だけが一覧に表示されている 101 © 2025 Hibiki Iwamoto All Rights Reserved
動作検証 - ケース一覧 4/5 次のケースに基づき、期待する結果通りになるか動作検証してみましょう。 No (12) 画面 ユーザー一覧 画面 操作 期待する結果 1.検索ボックスに登録済みのユーザー 名を入力 2.検索ボタンを押下 一致するユーザーが0件となる 1.一覧のメールアドレス列のにある ▲or▼マークをクリック メールアドレスに基づいて、ユーザ ー一覧の並びが昇順、降順で切り替 わる 備考 (13) ユーザー一覧 画面 (14) ユーザー一覧 画面 1.フィルター欄の「管理者で絞り込 む」にて、はいを選択 管理者ユーザーのみが一覧に表示さ れる (15) ユーザー一覧 画面 1.フィルター欄の「管理者で絞り込 む」にて、いいえを選択 一般ユーザーのみが一覧に表示され る 1.ユーザー一覧画面にて左上のホーム リンクをクリック 管理者ホーム画面にはUsersのみが 表示され、Groupは表示されていな 102 い © 2025 Hibiki Iwamoto All Rights Reserved (16) 管理者ホーム 画面
動作検証 - ケース一覧 5/5 次のケースに基づき、期待する結果通りになるか動作検証してみましょう。 No (17) (18) 画面 操作 期待する結果 備考 メインページが表示される ログイン画面 1.管理画面から追加したユーザーのメ ールアドレス、パスワードを入力 2.ログインボタンを押下 管理者ログイン 画面 1.管理画面から追加したユーザーのメ ールアドレス、パスワードを入力 2.ログインボタンを押下 エラーメッセージが表示される 管理者ログイン画面が表示される 103 © 2025 Hibiki Iwamoto All Rights Reserved
試してみよう 最後の課題です。次の変更要件を自分なりに加えてみましょう。 日付型の項目は初めて出てきますが、ヒントを参照すれば自力で解決できます! ◆要件 ユーザー情報に「生年月日」を追加 ◆ヒント 日付項目の定義はmodels.DateField()を使用します。 ◆DB定義 項目 フィールド名 型 サイズ ユニーク メールアドレス email メールアドレス型 255 ◯ ユーザー名 name 文字列型 150 - 有効フラグ is_active ブーリアン型 1 - 管理者フラグ is_admin ブーリアン型 1 - 生年月日 birthdate 日付型 - - 104 © 2025 Hibiki Iwamoto All Rights Reserved
05 お役立ち情報 開発やスキルアップに必要な情報をまとめました。 105 © 2025 Hibiki Iwamoto All Rights Reserved
デバッグ実行手順 デバッグ実行手順は下記の通りです。No.1~6は初回のみ操作が必要です。 ◆デバッグ実行開始 1.VS Codeのアクティビティバーから「実行とデバッグ」を選択(または、Ctrl + Shift + D) 2.「launch.jsonファイルを作成します」リンクをクリック 初回 3.コマンドパレットに出てくる選択肢から「Python Debugger」を選択 のみ 4.次の選択肢から「Django」を選択 5.次の選択肢から「manage.py」を選択 6.launch.jsonが自動で作成されて開くので、Ctrl + Sで保存 7.VS Codeの「実行」メニュー - 「デバッグの開始」を選択(またはF5) ◆デバッグ実行終了 1.VS Codeの「実行」メニュー - 「デバッグの停止」を選択(またはShift + F5) 下記サイトにてイメージ付きで解説しています。必要に応じて参照ください。 プログラミング初心者向けDjango開発環境構築 106 © 2025 Hibiki Iwamoto All Rights Reserved
学習再開時に表示されるエラー 学習再開時、VS Codeを起動すると次のエラーが出る場合は、Docker Desktopが立ち上がっていません。 (Windowsの場合) その場合は、Docker Desktopを実行してからVS Codeを起動してください。 一度Docker Desktopを立ち上げれば、必要なプログラムがバックグランドで実行されますので、 ✕ボタンでDocker Desktopを終了しても問題ありません。 107 © 2025 Hibiki Iwamoto All Rights Reserved
参考文献・サイト 1/2 Python基礎に関して、VTuberとして活躍しているサプーさんがとても分かりやすい動画を公開してくれています。 ご自身のレベルに応じて必要なものを参照ください。 No カテゴリ 要素 参照先 1-1 Python基礎 Python 書き方の基本 【Pythonプログラミング入門】Python 書き方の基本 〜VTuberと学習するプロ グラミング〜 1-2 Python基礎 変数と型 【Pythonプログラミング入門】変数と型 〜VTuberと学習するプログラミング〜 1-3 Python基礎 条件分岐 【Pythonプログラミング入門】制御構文 ifとfor を解説!〜VTuberと学習〜 初 心者でも必ずわかる!! Python基礎 関数の書き方 【Pythonプログラミング入門】関数の基本を解説!(def) VTuberと勉強しよう! 【初心者 独学用】 Python基礎 モジュール、パッケージ の基本 1-4 1-5 【Pythonプログラミング入門】モジュール・パッケージを解説!〜VTuberと学 習〜 初心者でも必ずわかる!! 108 © 2025 Hibiki Iwamoto All Rights Reserved
参考文献・サイト 2/2 Python基礎に関して、VTuberとして活躍しているサプーさんがとても分かりやすい動画を公開してくれています。 ご自身のレベルに応じて必要なものを参照ください。 No カテゴリ 要素 参照先 1-6 Python基礎 クラスの書き方 【分かる!】Pythonのクラスの基本を丁寧に解説!!【プログラミング入門】〜 VTuberと学習〜 【初心者向け】 1-7 Python基礎 クラスの継承 【Pythonプログラミング入門】クラスの継承を解説!〜VTuberと学習〜 【初心 者向け】 1-8 Python基礎 例外処理 【Pythonプログラミング入門】例外処理を解説!〜VTuberと学習〜 初心者でも 必ずわかる!! 1-9 Python基礎 デコレータの基本 【Pythonプログラミング入門】デコレータを解説! 〜VTuberと学習〜【初心者 向け】 109 © 2025 Hibiki Iwamoto All Rights Reserved
Thank you! note, Xで最新情報の配信を行っています。 ぜひフォローお願いします。 ◆note https://note.com/hibiki_i ◆X (旧Twitter) @hibiki_note 110 © 2025 Hibiki Iwamoto All Rights Reserved
免責事項 本書は、プログラミング学習を目的として作成されたものです。著者は、本書の内容について正確な情報を提 供するよう努めておりますが、必ずしもその完全性、正確性、有用性を保証するものではありません。 本書の利用により生じたいかなる結果についても、著者は一切の責任を負いません。プログラミング学習や開 発においては、ご自身の責任において判断し、行動してください。 本書からリンクされている第三者のウェブサイトやサービスの内容については、著者は一切関与せず、その正 確性、安全性、合法性などを保証するものではありません。 本書に記載されている内容は著者にその著作権があります。無断での複製、転載、流用、転売等の二次的利用 は、固くお断り致します。 本書の内容は、予告なく変更または更新されることがあります。 上記をご理解の上、本書をご利用いただきま すようお願い申し上げます。 111 © 2025 Hibiki Iwamoto All Rights Reserved