View on GitHub

管理サイト

Home

管理サイト

以前、カスタムユーザモデルの作成では、認証ユーザ用のユーザモデルとしてaccountsアプリケーションにおいてカスタムユーザモデルCustomUserを定義しました。それに加えて、モデルの定義では、onlineアプリケーションにおいてユーザモデルUserも定義しています。これらを紐付けるためにaccounts/models.pyに下記コードを追加してください。

リスト1: recsys_django/accounts/models.py

from django.db import models
from django.contrib.auth.models import AbstractUser

from online.models import User  # 追加


class CustomUser(AbstractUser):
    """カスタムユーザモデル

    Attributes
    ----------
    user : OneToOneField
        ユーザ
    """
    user = models.OneToOneField(User, models.DO_NOTHING, null=True)     # 追加

下記コマンドを実行し、マイグレーションファイルを作成します。

(venv_recsys_django) $ export DB_USER=rsl
(venv_recsys_django) $ export DB_PASSWORD=【パスワード】
(venv_recsys_django) $ python manage.py makemigrations accounts
Migrations for 'accounts':
  accounts/migrations/0002_customuser_user.py
    - Add field user to customuser

つづいて、マイグレーションを実行します。

(venv_recsys_django) $ python manage.py migrate
Operations to perform:
  Apply all migrations: accounts, admin, auth, contenttypes, online, sessions
Running migrations:
  Applying accounts.0002_customuser_user... OK

PostgreSQL上でaccounts_customuserテーブルの構成を確認してみましょう。

recsys_django=# \d accounts_customuser
                                Table "public.accounts_customuser"
    Column    |           Type           | Collation | Nullable |             Default              
--------------+--------------------------+-----------+----------+----------------------------------
 id           | bigint                   |           | not null | generated by default as identity
 password     | character varying(128)   |           | not null | 
 last_login   | timestamp with time zone |           |          | 
 is_superuser | boolean                  |           | not null | 
 username     | character varying(150)   |           | not null | 
 first_name   | character varying(150)   |           | not null | 
 last_name    | character varying(150)   |           | not null | 
 email        | character varying(254)   |           | not null | 
 is_staff     | boolean                  |           | not null | 
 is_active    | boolean                  |           | not null | 
 date_joined  | timestamp with time zone |           | not null | 
 user_id      | integer                  |           |          | 
...(略)...
Foreign-key constraints:
    "accounts_customuser_user_id_d3560d05_fk_users_user_id" FOREIGN KEY (user_id) REFERENCES users(user_id) DEFERRABLE INITIALLY DEFERRED
...(略)...

上記のように、usersテーブルのuser_idを参照する外部キーとしてuser_idカラムが追加されていることがわかります。このuser_idにより、新規に登録されたユーザがusersテーブル上のユーザと紐付けられることになります。

つづいて、ユーザを管理しやすくするため管理サイトを用意します。CustomUserモデルを管理サイトに登録するため、accounts/admin.pyに下記のコードを記述します。

リスト2: recsys_django/accounts/admin.py

from django.contrib import admin

from accounts.models import CustomUser


class CustomUserAdmin(admin.ModelAdmin):
    """カスタムユーザ管理クラス
    """
    list_display =  ('id', 'username', 'user_id')
    list_display_links = ('id', 'username', 'user_id')


admin.site.register(CustomUser, CustomUserAdmin)

次に、管理者権限をもつスーパーユーザを作成します。manage.pyがあるディレクトリにいることを確認したうえで、下記コマンドを実行してください。メールアドレス、Passwordは任意のもので結構です。

(venv_recsys_django) $ python manage.py createsuperuser
ユーザー名: admin
メールアドレス: admin@recsys-django.org
Password: 
Password (again): 
Superuser created successfully.

ブラウザからDjango管理サイトにアクセスするため下記のURLにアクセスしてください。末尾にadmin/を付けていることに注意してください。

http://localhost:8000/admin/

インタフェース

Django管理サイトへのログイン画面が表示されました。ここで、先ほど作成したスーパーユーザのユーザ名とパスワードでログインしてください。

インタフェース

管理サイトの画面が表示されます。

インタフェース

ユーザーをクリックすると、上図のように先ほど作成したスーパーユーザであるadminが確認できます。ここでは、一旦、ログアウトしておきましょう。

なお,管理サイトの詳細については文献[1]を参照してください.

参考

  1. 現場で使える Django の教科書《基礎編》 # 第13章 管理サイト(Django Admin)