ユーザーモデル(顧客・お届け先)と、ログイン・認証の仕組みを開発者向けにまとめます。
本書は
specs/20_アカウント・認証機能 実装手順書.md(Ver.3.0) を土台に、現行コード(accounts/config)と照合して再構成したものです。
関連: 顧客管理(管理者による顧客・お届け先の操作) / design/データベース設計
| 役割 | ファイル |
|---|---|
| ユーザー/お届け先モデル | accounts/models.py(User / Destination / CustomUnicodeUsernameValidator) |
| 認証バックエンド | accounts/backends.py(IgnoreSpaceModelBackend) |
| ログインビュー | accounts/views.py(CustomLoginView) |
| URL | accounts/urls.py(accounts:login / accounts:logout) |
| 認証設定 | config/settings.py(AUTH_USER_MODEL ほか) |
User)accounts.User は Django の AbstractUser を継承したカスタムユーザー(AUTH_USER_MODEL = 'accounts.User')。
username): USERNAME_FIELD。UTF-8 対応で、ひらがな・カタカナ・漢字・スペース・半角英数字・@.+-_ 等を許可。ユニーク制約。許可文字は CustomUnicodeUsernameValidator の正規表現 r'^[ぁ-んァ-ヶ一-龠々\w.@+\s-]+\Z' で定義される。実装上、\w は Unicode の単語文字(半角英数字に限らず Unicode 英数字・アンダースコア等を含む)、\s はタブ等を含む空白文字に一致するため、エラーメッセージの「ひらがな…半角英数字」より広い範囲が実際には通る点に注意。email): 任意(blank=True)。REQUIRED_FIELDS = ['email'] だが空文字を許容。is_staff: True で管理者扱い(管理者は農場主 1 名のみ運用)。利用者種別と権限の全体像は overview/システム概要 を参照。
Destination)顧客(User)に 1 対多で紐づく送付先。配送方法(YAMATO/TEWATASHI)・送料区分(NORMAL/ENCHI)・ソフトデリート(is_deleted)を持つ。フィールド詳細は データベース設計 §2.1、管理者からの CRUD は 顧客管理 を参照。
IgnoreSpaceModelBackend)AUTHENTICATION_BACKENDS は accounts.backends.IgnoreSpaceModelBackend のみ(ModelBackend を継承)。
' ' と全角スペース ' ' を除去し、DB 側の username も Replace で同様にスペース除去したうえで照合する。これは、日本語氏名を ID とする運用で姓名間のスペース有無の揺れ(例「山田 太郎」「山田太郎」「山田 太郎」)があっても認証を通すための意図的な設計であり、高齢など不慣れな顧客の入力ミスを減らす狙い(ログイン画面の既定平文表示と同じ趣旨)。check_password() と user_can_authenticate()(is_active 等)を満たせば認証成功。| URL 名 | パス | 実装 |
|---|---|---|
accounts:login |
/accounts/login/ |
CustomLoginView(テンプレート registration/login.html) |
accounts:logout |
/accounts/logout/ |
Django 標準 LogoutView |
CustomLoginView.get_success_url): is_staff なら管理者ダッシュボード(dashboard:dashboard_top)、一般顧客なら商品一覧(products:product_list)へ。config/settings.py): LOGIN_URL='accounts:login'、LOGIN_REDIRECT_URL='products:product_list'、LOGOUT_REDIRECT_URL='accounts:login'。@user_passes_test(is_staff_user, login_url='/accounts/login/') で保護される。仕様メモ(パスワード欄の初期表示): ログインテンプレート(
templates/registration/login.html)のパスワード入力欄は初期状態がtype="text"で、入力したパスワードが既定で表示される。これは意図した仕様で、高齢など IT 操作に不慣れな顧客が多く、限定された顧客向け運用であることから、入力ミスを減らすため既定を平文表示とし、隠したい場合はトグル(🙈/👁️)で非表示に切り替えられる設計(一般的な「初期=非表示」とは逆)。
元資料: specs/20_アカウント・認証機能 実装手順書.md (Ver.3.0) を現行コード(accounts/models.py, accounts/backends.py, accounts/views.py, accounts/urls.py, config/settings.py)と照合して再構成
関連: README, specs棚卸し表, Issue #1