【Django入門11】管理画面(admin)の使い方の基本

Djangoの管理画面の使い方の解説ページアイキャッチ

このページにはプロモーションが含まれています

このページでは、Django の管理画面(管理サイト)の使い方について解説を行なっていきます。

このページでは管理画面そのものや管理画面の使い方に焦点を当てて解説を行なっていますが、この管理画面はカスタマイズを行うこともでき、このカスタマイズに関しては次の連載となる下記ページで解説を行います。

【Django入門12】管理画面のカスタマイズ(ModelAdmin)

管理画面とは

管理画面とは、ウェブアプリの管理者専用のユーザーインターフェースです。管理画面は、管理サイト・admin ページ・admin サイトと呼ばれることもあります。

管理画面は下の図のような見た目のページとなっています。この管理画面は、settings.py での設定によって日本語化等も行うことができるのですが、このページではデフォルト設定のままの管理画面の図・文言を用いて説明していきます。

管理画面の紹介図

この管理画面は Django フレームワークから提供される機能の1つであり、この管理画面は Django で開発するウェブアプリにデフォルトで搭載されることになります。つまり、Django でウェブアプリを開発すれば、特別な設定等を行うことなく管理画面が利用可能です。

ですが、開発するウェブアプリに合わせて管理画面をカスタマイズする必要がある場合は、別途設定が必要となります。その設定を行う先のファイルが admin.py となります。このカスタマイズに関しては、次の連載となる下記ページで解説を行います。

【Django入門12】管理画面のカスタマイズ(ModelAdmin)

ちなみに、上記で「管理画面は Django で開発するウェブアプリにデフォルトで搭載される」と説明しましたが、デフォルトで搭載されるのは、プロジェクトの設定を行うファイルの settings.py で定義する INSTALLED_APPS に、デフォルトで django.contrib.admin が指定されているからになります。この INSTALLED_APPS から django.contrib.admin を削除しない限り、管理画面を利用することは可能です。

INSTALLED_APPS
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

管理画面でできること

次は、この管理画面でできることについて説明していきます。

管理画面ではレコードの管理が可能

この管理画面では、モデルクラスのインスタンスの管理を行うことができます。下記ページで解説しているように、モデルクラスとはデータベースにおけるテーブルであり、そのインスタンスはそのテーブルにおけるレコードとなります。

モデルの解説ページアイキャッチ 【Django入門6】モデルの基本

つまり、管理画面ではデータベースのテーブルにレコードを追加したり、レコードを編集したり、レコードを削除したりすることができます。

管理画面からデータベースにレコードを追加する様子

例えば、この Django 入門 の連載の中では掲示板ウェブアプリを開発しており、このアプリでは「コメント」の追加や「ユーザー」の登録を行うことができるようになっています。これらは、アプリのビュー・フォーム・テンプレートを利用してデータベースのテーブルへのレコードの追加を行なっていることになります。

ウェブアプリのページからデータベースにレコードを追加する様子

それに対し、管理画面を利用することで、ビューやフォームやテンプレートを用意しなくても、レコードの追加や編集・削除等を行うことができます。

権限に応じたレコードの管理

また、先ほど挙げた掲示板アプリもそうなのですが、ウェブアプリにおいてはユーザーを管理するモデルクラスを定義することも多いです。この場合、このクラスのインスタンスがウェブアプリのユーザーとなります。ユーザーを管理するモデルクラスも当然モデルクラスの一種ですので、管理画面ではユーザーの管理も行うことができます。管理画面から「ユーザーの新規登録」も行うこともできますし、「ユーザーを無効化」したり、「ユーザーを削除」することで強制退会させるようなことも出来てしまいます。

ただ、このような管理が誰でも行えてしまうと、誰でも他のユーザーを強制退会させるようなこともできてしまうことになります。例えば気に入らないという理由で一般ユーザーが他のユーザーを削除して強制退会させるようなこともできてしまいます。これだとアプリの運営として破綻してしまいますね…。

ユーザーが他のユーザーを削除する様子

そのため、この管理画面では、管理画面を利用中のユーザーの持つ権限に応じて操作可能なレコード管理が制限されるようになっています。なので、管理画面では、特定の権限を持つユーザーしかレコードの削除を行うことができず、上記のように “誰でもユーザーを強制退会させられる” ようなことはありません。また、そもそも、この管理画面を利用するためにはログインが必要となっています。そして、この管理画面へのログインに関しても、特定の権限を持ったユーザーのみがログイン可能となっています。このあたりの権限に関しては、後述の 管理画面とユーザー権限 で別途解説を行います。

上記のような、レコード管理が可能であったり、管理画面にログイン可能であったりするような権限はウェブアプリ開発者やウェブアプリ運営者にのみ付与されるようになっているため、通常のユーザーが他のユーザーの管理を行うようなことはできないようになっています。

つまり、管理画面はウェブアプリ開発者・運営者専用のユーザーインタフェースです。そして、このユーザーインタフェースからモデルのインスタンスの管理を行うことで、ウェブアプリを適切に運営していくことが可能になります。

スポンサーリンク

管理画面とユーザー

続いて、管理画面とユーザーとの関連について解説していきます。

管理画面とユーザー管理テーブル

前述の通り、管理画面を利用するためにはログインが必要となります。

このログインを行うログインフォームは下の図のようなものになります。

Djangoのログインフォーム

このログインでは、データベース内の「ユーザーを管理するテーブル」からログインフォームに入力されたユーザー名とパスワードが一致するレコードを探索し、探索に成功した&そのユーザーが特定の権限を持っている場合にログインに成功するようになっています。

ログインの仕組みを示す図

権限を持つかどうかの判断が行われる点は異なるものの、この辺りのログインの流れは下記ページで解説しているものと基本的には同じです。要は、テーブルの探索を行なって認証が実施されることになります。

ログインの実現方法の解説ページアイキャッチ 【Django入門10】ログイン機能の実現

で、ここで重要なのは、管理画面にログインするためにはデータベース内には「ユーザーを管理するテーブル」が必要という点になります。Django においては、モデルクラス = テーブル となりますので、ウェブアプリ内でユーザーを管理するモデルクラスが定義されていないと管理画面が利用できないことになります。さらに、そのテーブル内には特定の権限を持ったユーザーのインスタンスが存在していないとログインができず、管理画面も利用することはできません。

MEMO

ウェブアプリによってはユーザーの管理が不要なものもあると思いますが、管理画面を利用するためにはユーザーを管理するためのモデルクラスが必ず必要となります

したがって、管理画面を利用するためには、まず「ユーザーを管理するモデルクラス」を定義する必要があることになります。また、ログインを実現するためには、このモデルクラスにはユーザー名やパスワードの管理機能が必要となりますし、権限に応じたレコードの管理 で説明した権限に応じたレコードの管理を実現するためには、このモデルクラスは権限の管理機能が必要となります。

カスタムユーザー

で、上記のような「ユーザーを管理するモデルクラス」の1つが、下記ページで解説した カスタムユーザー になります。この カスタムユーザー はユーザー名・パスワード・権限管理可能なモデルクラスとなっていますので、このモデルクラスを利用して管理画面の利用を実現することができます。

【Django入門9】カスタムユーザーによるユーザー管理

ただし、カスタムユーザー は定義するだけではダメで、この定義した カスタムユーザー で管理画面を利用するためには、プロジェクトの settings.py に AUTH_USER_MODEL の設定を追記する必要があります。

AUTH_USER_MODEL = 'アプリ名.カスタムユーザーのクラス名'

カスタムユーザー を定義し、さらに上記のように AUTH_USER_MODEL の設定の追記を行えば、管理画面を利用するユーザーとして カスタムユーザー が適用されることになります。そして、カスタムユーザー のテーブルに、ログインの権限を持つインスタンス(レコード)を作成しておけば、管理画面の利用が可能となります。

より具体的には、そのインスタンスのユーザー名・パスワードで管理画面へのログインを行い、管理画面でのレコードの管理を行うことができるようになります。そして、この管理画面で行えるレコードの操作は、そのログインしたユーザー(ユーザー名とパスワードを持つインスタンス)に設定された権限に応じて自動的に制限されることになります。

MEMO

ここでは管理画面の説明に焦点を当てていますが、AUTH_USER_MODEL の設定により、プロジェクト内で行うログイン時に利用するテーブルも AUTH_USER_MODEL に指定したモデルクラスのものに変化することになります

このあたりは下記ページで解説していますので、詳細に関しては下記ページを参照してください

ログインの実現方法の解説ページアイキャッチ 【Django入門10】ログイン機能の実現

authUser

また、別に カスタムユーザー を定義せず、さらに AUTH_USER_MODEL の設定の追記を行わなくても、管理画面の利用は可能です。

settings.pyAUTH_USER_MODEL の設定を追記しなかった場合、管理画面を利用するユーザーとして、 django.contrib.auth というアプリから提供される User が適用されることになります。そして、この User のテーブルに、ログインの権限を持つインスタンス(レコード)を作成しておけば、管理画面の利用が可能となります。

この User は、カスタムユーザー と同様に AbstractUser を継承して定義されたモデルクラスで、特にパスワードや権限の管理機能に関しては カスタムユーザー と同様のものを持ちます。

なので、わざわざ カスタムユーザー を定義しなくても管理画面の利用は可能です。ただ、User はユーザーを管理するモデルクラスとして完成したものであり、カスタマイズにはあまり向いていません。なので、開発するウェブアプリに応じてユーザーを管理するモデルをカスタマイズしていくのであれば、カスタムユーザー を定義して、それをウェブアプリで利用することが推奨されています。

このページでは管理画面の使い方を説明するだけなので User を利用することを前提に解説を進めていきますが、基本的には、以降の解説の中で行う User に関する説明は カスタムユーザー にも共通であるということはしっかり頭に入れておいてください。

テーブルの作成が必要

また、管理画面でのレコードの管理は、既に作成済みのテーブルに対して行われることになります。

したがって、管理画面でレコードの管理を行うためには、事前にテーブルの作成を行っておく必要があります。

ここまでの Django 入門 の連載を読んできていただいた方ならすでに理解していただいていると思いますが、テーブルの作成は下記の2つのコマンドで実施することができます。1つ目のコマンドに関しては models.py を変更していなければ不要になります。

% python manage.py makemigrations
% python manage.py migrate

管理画面とユーザー権限

続いて、管理画面におけるユーザーの権限について解説していきます。

前述の通り、管理画面にログインできるのは特定の権限を持ったユーザーのみとなります。Django には、こういったログイン可能な権限を持つユーザーを作成するコマンドとして createsuperuser コマンドが用意されています。

このコマンドで作成されるユーザーは「スーパーユーザー」と呼ばれる種類のユーザーになります。スーパーユーザーは、簡単に言えば「どんな権限でも持つユーザー」で、このスーパーユーザーであれば管理画面へのログインもできますし、どんなレコード管理でも行うことができます。なので、管理画面を利用する時には、まずは createsuperuser コマンドでスーパーユーザーを作成することになります。

スーパーユーザーが管理画面での全ての権限を持つことを示す図

このスーパーユーザーが全ての管理を行うことができるのは、スーパーユーザーが管理画面での全ての管理に対する権限を持っているからになります。ですが、他のユーザーの場合は、管理画面でできることが制限されています。

このように、管理画面で管理できることをユーザーの種類によって制限できるよう、Django の User  (カスタムユーザー) には3種類のユーザーが設けられています。その3種類のユーザーが下記となります。

  • スーパーユーザー
  • ノーマルユーザー
  • スタッフユーザー

これらの3種類のユーザーについて、ここから説明していきたいと思います。

スーパーユーザー

スーパーユーザーは、管理画面での全ての管理の権限を持つユーザーとなります。

どんなモデルクラスのインスタンスの追加や削除も行うこともできますし、他のユーザーを追加したり、他のユーザーに権限を付与したりすることもできます。

基本的には、ウェブアプリ開発者や運営者に与えられる種類のユーザーとなり、このスーパーユーザーは createsuperuser によって作成することができます。

ノーマルユーザー

それに対し、ノーマルユーザーは管理画面での管理が一切許可されていないユーザーとなります。そもそも管理画面へのログインも許されていません

要は、ウェブアプリの一般利用者がノーマルユーザーです。

スタッフユーザー

スタッフユーザーは、一言で表せば管理画面へのログインが可能なユーザーとなります。さらに、他のユーザーから付与された権限に従って管理画面での管理が可能となるユーザーとなります。他のユーザーとは、例えばスーパーユーザーが挙げられます。

もう少し具体的に説明していくと、まず、スタッフユーザーに設定されたユーザーは管理画面へのログイン自体は可能です。ですが、管理画面で実施可能な管理は与えられた権限に依存します。何も権限が与えられていなければ、ログインだけはできるけど何も管理できないユーザーとなりますし、スーパーユーザー等から権限が与えられれば、その権限内での管理を管理画面から行うことができるようになります。

例えば、特定のモデルクラスのインスタンスに対して「表示」と「追加」と「編集」の権限が付与されたスタッフユーザーであれば、そのモデルクラスのインスタンスに対する表示・追加・編集のみを管理画面で行うことができるようになります。この権限の付与の仕方はスーパーユーザー等が好きなように設定することができます。

基本的には、そのユーザーの立場や運営の方針等に応じて、適切にスタッフユーザーに権限を付与していくことになります。

また、権限の付与自体はノーマルユーザーに対しても行うことができますが、ノーマルユーザーは管理画面にログインを行うことができないため、権限が付与されても意味がないことになります。

グループ

管理画面においてはグループ単位で権限を付与するようなことも可能です。例えば特定のスタッフユーザーに何らかのグループに所属させれば、そのグループの持つ権限全てをそのスタッフユーザーが得ることができることになります。一人一人に対して権限を付与するのではなく、グループ単位で権限を付与できるので管理が楽になります。

グループと各ユーザーの権限の関係を示す図

このように、3種類のユーザー、さらにはグループを使い分けることで、管理画面でのウェブアプリの管理を安全に行えるようになっています。規模の大きなウェブアプリを運営していくことになればスタッフユーザーを用意し、権限を分譲して分業体制で運営していくことになると思いますが、お試しでウェブアプリを開発しているような場合は、基本的にはノーマルユーザーとスーパーユーザーのみの使い分けだけでも十分だと思います。

スポンサーリンク

管理画面の使い方

続いて、管理画面の使い方を解説していきます。

せっかくなので、実際に管理画面を操作しながら、管理画面の使い方について解説していきたいと思います。

ただし、Django 入門 の連載の中で開発してきた掲示板アプリは今回は利用せず、新規にプロジェクトを作成して使い方を説明していきたいと思います。次の連載で管理画面のカスタマイズについて説明しますので、そこで掲示板アプリに対する管理画面の使い方を別途説明します。

プロジェクトを作成する

ということで、まずは startproject を実行して新規にプロジェクトを作成していきましょう!プロジェクト名は何でも良いのですが、ここでは admintest という名前でプロジェクトを作成していきたいと思います。

まず、適当な作業フォルダに移動し、ターミナルやコマンドプロンプト等から下記コマンドを実行してください。

% django-admin startproject admintest

これにより、今いる作業フォルダ内に admintest というフォルダが作成されているはずです。

データベースを作成する

続いてデータベースを作成していきます。まず、先ほど作成された admintest フォルダの中に移動し、下記コマンドを実行してマイグレーションを実行しましょう!今回は models.py は変更しないため、下記の migrate のみを実行すれば OK です。

% python manage.py migrate

これにより、User のテーブルがデータベース内に作成されることになります(GroupPermission といったテーブルも同時に作成されます)。

次に createsuperuserUser のテーブル内にスーパーユーザーをレコードとして作成することになりますが、事前にテーブルを作成していないとユーザーの作成に失敗することになるので注意してください。

スポンサーリンク

スーパーユーザーを作成する

ということで、次は createsuperuser コマンドでスーパーユーザーを作成します。まず、今いるフォルダで下記コマンドを実行してください。

% python manage.py createsuperuser

実行すれば、ユーザー名・メールアドレス・パスワード(確認用も含めて2回)の入力が促されることになります。特にメールアドレスやパスワードは妥当であると判断されないと警告が表示されることになるため注意してください。今回は、説明を簡単にするため下記のように各種情報を入力してください。

  • ユーザー名:YamadaHanako
  • メールアドレス:hanako@example.com
  • パスワード:yh123456

ユーザー名・メールアドレス・パスワード(確認用も含めて2回)の入力後、下記のメッセージが表示されればスーパーユーザーの作成は完了となります。

Superuser created successfully.

開発用サーバーを起動する

事前準備の最後として開発用サーバーを起動させておきましょう!通常のウェブアプリ同様に、管理画面を利用するためにも開発用サーバーの起動が必要となります。今いるフォルダで下記コマンドを実行すれば、開発用サーバーが起動するはずです。

% python manage.py runserver

管理画面にログインする

ここからは実際に管理画面を利用していきます。まずは管理画面をウェブブラウザで表示するため、ウェブブラウザの URL バーに下記の URL を指定してください。

http://localhost:8000/admin/

すると、下の図のようなログインフォームが表示されるはずです。

Djangoのログインフォーム

ここは少し余談になるかもしれないですが、URL を指定することで管理画面(のログインフォーム)が表示されるのは、いつも開発しているウェブアプリと同様に urls.py で URL と関数とがマッピングされているからになります。コメントは省略していますが、admintest フォルダの下にある urls.py は初期状態で下記のようになっており、通常の URL マッピングとは異なる書き方になっていますが、admin.site.urls から実行されるメソッドの中で通常の URL マッピングと同様の書き方で  urlpatterns の定義が行われることになっています。

初期状態のurls.py
from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
]

ということで、管理画面に関しても、私たちが開発するウェブアプリと同様の作りになっていますし、初期状態で上記のように urls.py が作られているため、特に設定を行うことなく管理画面を利用することができるようになっています。

ちょっと話が横道にそれましたが、次は先ほど表示されたログインフォームにユーザー名とパスワードを入力して Log in ボタンをクリックしましょう!ここで入力するユーザー名とパスワードは、先ほど作成したスーパーユーザーのものになります。

ログインを行う様子

ログインに成功すれば下の図のようなページに遷移するはずです。これが管理画面のトップページであり、ここで様々なモデルのインスタンスの管理を行うことができるようになっています。そして、現在はスーパーユーザーでログインしているため、どんな管理も行うことができるようになっています。

管理画面のトップページ

スポンサーリンク

管理画面でインスタンスの管理を行う

といっても、現状管理画面から管理可能なモデルクラスは UserGroup のみとなります。ただ、管理可能なモデルクラスは追加することが可能で、その追加方法については次の連載となる下記ページで解説を行います。

【Django入門12】管理画面のカスタマイズ(ModelAdmin)

他のモデルクラスに対し、これらの User と Group は特別な存在のモデルクラスになります。それは、これらのモデルクラスがユーザーの権限を管理する機能を持つモデルクラスになるからです。なので、他のモデルクラスに比べて、これらのクラスのインスタンスの管理は若干ややこしいです。といっても、権限の管理の面を除けば、基本的な各モデルクラスのインスタンスの管理方法は同じですので、ここでまず User に対するインスタンスの管理方法について理解しておきましょう。

また、管理画面はカスタマイズが可能で、admin.py というファイルを編集することで、このカスタマイズを行うことが可能となります。もう少し具体的に言えば、各モデルクラスに対し、追加フォーム等に表示するフィールドや一覧に表示するフィールドなどをカスタマイズすることができます。

管理画面の具体的なカスタマイズ方法については上記の次の連載のページで説明を行うことになりますが、ここでもカスタマイズ可能な箇所について補足を入れながら解説を行なっていきたいと思います。

インスタンスの表示

では、まずは User のインスタンスの表示を行なっていきたいと思います。

現状、管理画面のトップページが表示されていると思います。この管理画面の左側には、アプリ毎にモデルクラスの一覧が表示されています。緑色っぽい背景(色は異なる可能性があります)に記載されているのがアプリに対応する名称になり、その下側に表示されているのが、そのアプリで定義されているモデルクラスの一覧となります。で、ここで表示されているものが、管理画面から管理可能なモデルクラスとなります。

例えば下の図で言えば、AUTHENTICATION AND AUTHORIZATION がアプリの名称を示しており、その下側に表示されている GroupsUsers がモデルクラスの名称を表しています。

管理画面に表示されているアプリ名とモデル名の説明図

これらは具体的には、settings.pyINSTALLED_APPS に登録されている django.contrib.auth で定義されているモデルクラスの一覧となります。実際に定義されているのは GroupUser になりますが、管理画面上にはモデルクラス名に s が付加された形で、つまり複数形で名称が表示されることになります。

これと同様に、管理画面のカスタマイズを行うことで、自身で開発しているアプリに定義したモデルクラスも管理画面に表示することができ、そのモデルクラスのインスタンスを管理することができるようになります。で、この方法については次の連載で解説するとして、ここでは User のインスタンスの管理を行なっていきましょう!

まずは、User のインスタンスの一覧を表示したいと思います。この一覧は、下の図のオレンジ枠で示す Users リンクをクリックすることで表示することができます。

User一覧を示すための手順を示す図

すると、ページが遷移して下の図のような一覧表が表示されると思います。これが User のインスタンスの一覧となります。トップページで Users ではなく Groups リンクをクリックした場合は、Groups のインスタンス一覧が表示されることになります。   

ユーザー一覧が表示される様子

Django において、モデルクラスはテーブルであり、インスタンスはそのテーブルのレコードとなります。つまり、上の図では、テーブル内のレコードの一覧が表示されていることになります。

現状、User のテーブルには、createsuperuser コマンドで追加した1つのインスタンス(レコード)しか存在しないため、上の図のように1つのインスタンスの情報のみが表示されているはずです。今後、インスタンスの追加を行うことで、この一覧に表示されるインスタンスが増えていくことになります。

また、この一覧では USERNAMEEMAIL ADDRESSFIRST NAMELAST NAMESTAFF STATUS という5つの項目が表示されていますが、これらの表示項目もカスタマイズすることが可能です。

インスタンスの編集

続いて、既に存在している User のインスタンスの編集を行なっていきたいと思います。

先ほど表示された一覧表では、USERNAME フィールドの項目にリンクが設定されています。情報を編集したいユーザーの USERNAME の項目のリンクをクリックすれば、そのインスタンスの編集フォームが表示されることになります。

ユーザー編集フォームを表示するためのリンクの説明図

表示されるのが下図のようなフォームとなり、ここでインスタンスの情報を編集し、最後にページ最下部にある SAVE ボタンをクリックすることで、その編集を反映、すなわちインスタンスの編集を行うことができます。

Userの編集フォームを示す図

例えば、First name フィールドと Last name フィールドに情報を入力して SAVE ボタンをクリックすれば、インスタンスが更新され、インスタンスの一覧表に入力した FIRST NAMELAST NAME が表示されるようになることが確認できると思います。

編集結果が一覧表に反映されていることをを示す図

このように、管理画面ではインスタンスの編集を行うことができます。

さて、先ほどインスタンスの編集フォームが表示されましたが、ここで入力可能なフィールドはどのようにして決まるのでしょうか?

これらの入力可能なフィールドは基本的に User モデルクラスの持つフィールドになります。例えば先ほど変更した First name フィールドと Last name フィールドは User モデルクラスの持つフィールドです(Userfirst_name フィールドと last_name フィールドを持っている)。つまり、編集フォームはモデルクラスの持つフィールドに応じて生成されることになります。なので、User とは異なるモデルクラスの編集フォームは先ほど表示されたものとは違うことになります。

例えば Group の編集フォームは下の図のようなものであり、User とは全くこのとなるものであることが確認できると思います。

Groupの編集フォーム

また、カスタマイズを行うことで、この編集フォームに表示されるフィールドを変更することも可能です。例えば、User の編集フォームから First name フィールドと Last name フィールドを消すようなことも可能です。

編集フォームがモデルクラスごとに異なるように、管理画面のカスタマイズもモデルクラス単位で行っていくことになります。これは編集フォームだけでなく、追加フォームやユーザの一覧表の項目なども同様です。

インスタンスの追加

次は、User のインスタンスの追加を行なっていきます。

User のインスタンスの追加フォームは、インスタンス一覧表示ページの下の図のオレンジ枠で示す ADD USER ボタンをクリックすることで表示することができます。

Userの追加フォームを表示するためのボタンを示す図

クリックすれば、下の図のようなフォームが表示されますので、ここでユーザー名とパスワード(2回)を入力して SAVE ボタンをクリックすることでインスタンスの追加を行うことができます。また、ここで入力受付を行うフィールドの追加も、カスタマイズを行うことで変更することが可能です。

Userの追加フォームを示す図

SAVE ボタンをクリックすれば編集フォームが表示されますので、ここで情報を再度編集することも可能です。ですが、今回は何も編集を行わず、ページ最下部の SAVE ボタンをクリックしてください。

SAVE ボタンをクリックすれば、再度インスタンスの一覧が表示されることになり、そこに先ほど追加したユーザーが表示されていることが確認できると思います。

Userの一覧表にインスタンスが追加されたことを示す図

インスタンスの削除

次はインスタンスの削除を行なっていきます。

インスタンスの削除は、インスタンスの一覧から削除したいユーザーにチェックを入れ、一覧の上側にある Action リストから Delete selected users を選択して Go ボタンをクリックすることで行うことができます。

今回は、先ほど追加を行なったインスタンス、つまりスーパーユーザーでない方のインスタンスにチェックを入れて削除を行なってください。

Userの一覧表から削除したいインスタンスを選択する様子

確認画面が表示されるので、Yes, I'm sure ボタンをクリックすれば、再度 User の一覧が表示され、削除したインスタンスが一覧から消えていることが確認できると思います。これはつまりテーブルからレコードが削除されたことを意味します。

Userの一覧表から削除したいインスタンスが消える様子

ここまで説明してきた通り、管理画面からはインスタンスの追加・表示・編集・削除を行うことができます。よりデータベースっぽい言葉を使えば、管理画面から CRUD 操作(Create・Read・Update・Delete)を行うことができます。

また、今回は User を利用して説明を行いましたが、他のモデルクラスの場合も同様の手順でインスタンスの追加・表示・編集・削除を行うことができます。ただし、各種フォームに表示されるフィールドはモデルクラスに応じて異なるので、その点はご注意ください。また、管理画面で管理可能なモデルクラスの追加方法については次の連載となる下記ページで解説を行います。

【Django入門12】管理画面のカスタマイズ(ModelAdmin)

管理画面で権限の管理を行う

次は、管理画面での権限についての説明を行なっていきます。

管理画面とユーザー権限 で説明した通り、ユーザーには下記の3種類のものが存在し、この種類によって付与される管理権限が異なることになります。

  • スーパーユーザー
  • ノーマルユーザー
  • スタッフユーザー

また、特にスタッフユーザーを特定のグループに所属させることで、グループに応じた権限を付与することもできます。

ただし、これらの権限管理は django.contrib.auth で定義される UserGroup のみが持つ機能であり、権限管理の考え方は基本的には他の通常のモデルクラスには存在しないものとなるので注意してください。もう少し具体的に言えば、権限の管理は AbstractUser というクラスによって提供されます。したがって、ここで説明する権限管理を行いたいのであれば、これらのクラスのサブクラスとしてモデルクラスを定義する必要があります。

例えば UserAbstractUser のサブクラスとして定義されているため、ここで説明する権限管理を行うことができるようになっています。したがって、ユーザーを管理するモデルを User ではなく独自に定義したモデルクラスとしたい場合でも、権限管理を行うのであれば AbstractUser のサブクラスとして定義する必要があります。逆に言えば、AbstractUser のサブクラスとして定義してやれば、User を利用しなくても管理画面での権限管理を行うことができるようになります。そして、その一例が カスタムユーザー になります。

MEMO

権限管理の機能は PermissionsMixin というクラスで定義されていますので、これを継承したクラスを定義するのでも良いです

AbstractUser が権限の管理を行うことができるのも、この PermissionsMixin を継承していることが理由となります

少し話は逸れましたが、重要な点をまとめておくと、ここで説明する権限管理については django.contrib.auth で定義される User (AbstractUser 等を含む) や Group に特化したものであるという点になります。

管理権限の確認のためのユーザー追加

ということで、次は管理画面を利用しながら各種ユーザーの違いを確認していきたいと思います。

現状、スーパーユーザーで管理画面にログインしている状態になっており、ここまでの説明の通り、このユーザーでは管理画面での全ての管理を行うことができるようになっています。実際に先ほどの解説の中で、インスタンスの追加・表示・編集・削除が行えることを手順を実施しながら確認していただいたと思います。

続いて、スーパーユーザー以外のユーザーの管理画面での権限を確認していきたいと思います。そのために5つの User のインスタンスを作成していきます。

まず、User のインスタンス一覧を表示し、ADD USER ボタンをクリックしてください。そして、表示されるフォームのユーザー名に NormalUser という名前を入力し、パスワードには yh123456 をを入力して SAVE ボタンをクリックしてください。さらに、次に表示される編集フォームでは何も編集は行わず、ページ最下部の SAVE ボタンをクリックしてください。

Userのインスタンスを追加する様子

これで一人のユーザーが追加されたことになります。同様の手順で、StaffUser_noStaffUser_addStaffUser_delStaffUser_group というユーザー名の4つの User のインスタンスを追加してください。

MEMO

補足しておくと、ここでは権限の確認を行なっていくことが目的であるため、パスワードはなんでも良いです

ただし、今後の説明の中でパスワードを入力する機会があるため、パスワードは覚えやすいものにしておいてください

ここでは全ユーザーのパスワードが yh123456 であるものとして説明をしていきたいと思います

追加したユーザーは、User のインスタンス一覧に表示されているはずです。そして、一番右側の STAFF STATUS がスタッフユーザーであるかどうかを示す列になります。ここからの手順で、特定のユーザーをスタッフユーザーに指定していきます。

必要なインスタンスを追加した後のUser一覧

では、各ユーザーに権限の付与を行なっていきます。

一人目の NormalUser はノーマルユーザーとして扱っていきたいので、権限の付与は行いません。

二人目の StaffUser_no はスタッフユーザーとして扱うようにしていきます。ただし、スタッフユーザーに設定するだけで、権限の付与は行いません。

このような権限付与は、編集フォームで下図で示す Staff status チェックボックスにチェックを入れるだけで実現することができます。つまり、下記のチェックボックスチェックを入れるだけで、そのユーザーをスタッフユーザーに設定することができます。チェックを入れた後にページ最下部の SAVE ボタンを押すのを忘れないようにしてください。

Userのインスタンスをスタッフユーザーに設定する様子

3人目の StaffUser_add もスタッフユーザーとして設定し、StaffUser_add に関してはUser のインスタンスの追加・表示・編集の権限を付与したいと思います。

この場合、先ほどと同様に Staff status チェックボックスにチェックを入れるだけでなく、User permissions フィールドで Chosen user permissions に下記の3つを設定しておく必要があります。

  • auth | user | Can add user
  • auth | user | Can change user
  • auth | user | Can view user

このユーザーの編集フォームで Chosen user permissions に設定された権限が、そのユーザーに付与される権限になります。

Chosen user permissions に表示される権限の名称は下記のような形式になっており、この名称から、各項目を設定することで、”どのアプリ” の “どのモデルクラス” に対して “どんな権限” が与えられるのかを確認することができます。

アプリ名 | モデルクラス名 | 権限の種類

また、この権限の名称より、モデルクラス単位で権限の設定が可能であることも認識していただけると思います。

そして、上記のように3つの権限を設定すれば、StaffUser_add には auth というアプリの User モデルクラスに対して addchangeview、すなわち User のインスタンスの追加と編集と表示の権限が与えられることになります。

そして、この権限付与の設定は、まず権限を付与したいユーザーの編集フォームを開き、User permissions フィールドの左側にある Available user permissions のリストの中から付与したい権限を選択し、さらに右矢印ボタンをクリックすることで行うことができます。これにより、選択したい権限が Chosen user permissions に加えられ、これによって、そのユーザーに与えられた権限が増えたことになります。

権限の追加の手順を示す図

逆に権限を剥奪したい場合は、Chosen user permissions 側で剥奪したい権限を選択し、左矢印ボタンをクリックしてやれば良いです。

権限の剥奪の手順を示す図

最後に、ページ最下部の SAVE ボタンをクリックすれば、編集フォームで行った編集、今回の場合は権限付与の設定が反映されることになります。注意点としては、この SAVE ボタンをクリックしないと編集の結果が反映されないという点と、権限には似たような名前のものが多いので選択ミスが起こりやすいという点が挙げられます。

同様に、4人目の StaffUser_del もスタッフユーザーとして設定し、さらにユーザーの削除と表示の権限を与えていきましょう!手順に関しても先ほど同様に、まず Staff status チェックボックスにチェックを入れ、続いて User permissions フィールドで Chosen user permissions に下記の2つを設定してから SAVE ボタンをクリックしてください。

  • auth | user | Can delete user
  • auth | user | Can view user

これで4人目のユーザーの用意も完了となります。

最後に、5人目の StaffUser_group への権限付与を行なっていきます。この StaffUser_group に関しては、ユーザー単位の権限付与ではなくグループ単位での権限付与を行なっていきます。

この場合、まずは Group のインスタンスの作成が必要となりますので、このインスタンスの作成手順から説明していきます。まず、管理画面のページ最上部にあるタイトル Django administration をクリックしてください。これにより管理画面のトップページに移動することができます。

続いて、Groups というテキストの右側にある Add リンクをクリックしてください。

Groupのインスタンスの追加手順

そうすると、下の図のようなフォームが表示されることになります。

Groupの追加フォーム

ご覧の通り、User の編集フォームと同様に権限付与設定が行えるようになっていることが確認できると思います。また、User の時とは追加フォームに表示されるフィールドが異なっており、モデルクラス毎に異なる追加フォームが表示されることも確認できると思います。

ここでは下の図のように NameUserAdministrator を入力し、さらに Permissions フィールドの Chosen permissionsauth | user 関連の権限全てを設定して SAVE ボタンをクリックしてください。

Groupのインスタンスの追加手順を示す図

これにより、Group のインスタンスが追加され、追加したインスタンスが Group の一覧表に表示されていることが確認できると思います。そして、このインスタンスは、先ほどの追加フォームで設定した通り、User 関連の権限全てを持つグループとなります。そして、この Group のインスタンスに所属する UserGroup と同じ権限が付与されることになります。

グループと各ユーザーの権限の関係を示す図

ということで、次は User のインスタンスである StaffUser_group を、先ほど作成した UserAdministrator に所属させるようにしていきましょう!

まずは、User の一覧表を表示し、StaffUser_group というリンクをクリックしてください。User の一覧表は、ページ最上部の Django administration をクリックしてトップページを表示し、さらにそのトップページの Users リンクをクリックすることで表示することができます。

続いて、StaffUser_group の編集を行なっていきます。このユーザーもスタッフユーザーとして設定するために Staff status のチェックボックスにチェックを入れます。さらに、次は Groups フィールドで Chosen groups に先ほど追加した UserAdministrator を設定して SAVE をクリックします。設定方法は User permissions フィールドと同様なので、ここでは説明を省略します。

UserのインスタンスをGroupのインスタンスに所属させる様子

これにより、StaffUser_groupUserAdministrator に所属することになり、UserAdministrator の持つ権限が StaffUser_group にも与えられたことになります。ということで、これで5人目の StaffUser_group の用意も完了したことになります。

少し補足しておくと、ここでいう「所属する・所属させる」とは、要は2つのインスタンスが関連付けされていることを言っています。User には ManyToManyField が存在し、これによって User のインスタンスと Group のインスタンスとを関連付けできるようになっています。ManyToManyField なので、User のインスタンスと Group のインスタンスとは多対多の関連付けが可能ということになります。この辺りのリレーションに関しては下記ページで解説していますので、詳しく知りたい方は下記ページをご参照ください。

Djangoのリレーションの解説ページアイキャッチ 【Django入門7】リレーションの基本

また、今回の場合、auth アプリの User モデルクラスに関する権限を付与する例のみを示していますが、もちろん他のアプリの他のモデルクラスに関する権限を設定するようなことも可能です。例えば、この Django 入門 の連載の中で開発している掲示板アプリでは forum アプリを作成して Comment モデルクラスの定義を行なっています。なので、下記のような権限をユーザーに付与すれば、そのユーザーは forum アプリの Comment モデルクラスのインスタンスを追加・編集・表示・削除する権限を持つことになります。

  • forum | comment | Can add comment
  • forum | comment | Can change comment
  • forum | comment | Can view comment
  • forum | comment | Can delete comment

いずれにしても、権限の付与はモデルクラス単位で行われるところがポイントになると思います。

管理権限の確認

続いて、先ほど用意した User のインスタンスを利用し、管理者権限についての確認を行なっていきたいと思います。

現状ログインしているのは最初に createsuperuser コマンドで作成した YamadaHanako になるかと思います。もしかしたらユーザー名は異なるかもしれませんが、いずれにせよスーパーユーザーのインスタンスでログインをしているため、特に設定もすることなく UserGroup のインスタンスの作成等が行えていました。このように、スーパーユーザーは管理画面での全ての管理の権限を持つユーザーとなります。

このスーパーユーザーは createsuperuser コマンド、もしくは管理画面から作成したユーザーにスーパーユーザー権限を付与することで作成することができます。スーパーユーザー権限は User の編集フォームで Superuser status のチェックボックスにチェックを入れることで付与することができます。ただし、これだけでは管理画面にログインできないため、Staff status へのチェックを入れることも必要となります。

続いてノーマルユーザーの管理画面での権限の確認を行なっていきましょう!まず、ページ上部の右側にある LOG OUT をクリックしてログアウトを行なった後、管理画面へのログインフォームを表示してください。ログアウトした状態であれば、管理画面へのログインフォームは下記 URL の指定により表示することができます。

http://localhost:8000/admin/

続いて、ログインフォームにユーザー名 NormalUser を、パスワードに NormalUser 追加時に設定したパスワード入力して Log in ボタンをクリックしてください。ここまでの手順通りに進めてくださった方であればパスワードは yh123456 に設定されているはずです。

ただし、Log in ボタンをクリックしたとしても、下の図のような画面が表示されてログインは行えないはずです。

ノーマルユーザーが管理画面にログインできないことを示す図

この理由は、ノーマルユーザーは管理画面にログインする権限を持たないからになります。このように、ノーマルユーザーは管理画面にログインすることすらできず、管理画面での管理を行うことが出来ません。

続いて、スタッフユーザーの権限を確認していきたいと思います。

まず、今表示されているログインフォームでユーザー名 StaffUser_no でログインを実施してください。この StaffUser_no はスタッフユーザーですので、ログインには成功するはずです。ですが、ログイン後に表示される管理画面は下図のようになっており、何も管理を行えないことが確認できると思います。

スタッフユーザーであっても権限を持たなければ管理画面での管理が行いことを示す図

つまり、StaffUser_no はスタッフユーザーであるため管理画面にログインすることは可能であるものの、何も権限が付与されていないために管理画面では何も操作を行うことができない状態になっています。このように、スタッフユーザーは管理画面にログイン可能なユーザーではあるものの、管理画面での管理が行えるようにするためには、別途権限の付与が必要となります。

続いて、再度ログアウトを実施したのちにログインフォームを表示してください。そして、今度は StaffUser_add でログインを行なってください。

ログインを行うと管理画面に遷移し、今度は画面が下の図のようになっていることが確認できると思います。ポイントは、Users リンクやその右側の Add リンク・Change リンクが表示されている点と、スーパーユーザーでログインした時には表示されていた Groups リンクが消えていることになります。

Userの管理権限が与えられていること、さらにGroupの管理権限が与えられていないことが確認できる図

StaffUser_addUser に対する追加・編集・表示の権限を持つユーザーとなります。そのため、これらの管理を行うためのリンクに関しては画面に表示されています。しかし、Group に対する権限は持っていないため、管理不可な Group に関するリンクは表示されていません。

このように、管理画面はログインしたユーザーの権限に応じて変化するように作成されています。

また、StaffUser_addUser に対する追加・編集の権限を持っているため、管理画面でインスタンスの管理を行う で示した手順でインスタンスの追加や編集が行えることも確認できると思います。

ですが、削除の権限は持っていないため、削除は実施できません。例えば、スーパーユーザーでログインしていた場合は User の一覧画面には各ユーザーに対してチェックボックスが用意されており、そのチェックボックスによって削除対象のユーザーを選択し、さらに削除を実行することができました。

ですが、StaffUser_add でログインした状態だと、User の一覧画面には各ユーザーに対するチェックボックスが用意されておらず、削除操作を行うことができないようになっています。この結果からも、管理画面はログインしたユーザーの権限に応じて変化するように作成されていることが確認できると思います。

削除権限を持たないユーザーでログインすると削除対象を選択するチェックボックスが表示されないことを示す図

StaffUser_del でログインした場合もほぼ同様です。ですが、StaffUser_add の場合とは異なり、削除は可能ではあるものの追加・編集は不可となっています。例えば、StaffUser_add でログインした場合は User の一覧表に削除対象を選択するためのチェックボックスが表示されませんでしたが、StaffUser_del でログインした場合はこれらのチェックボックスが表示され、削除も実際に行うことが出来ます。

削除権限を持つユーザーでログインすると削除対象を選択するチェックボックスが表示されることを示す図

StaffUser_group の場合も同じようなことになりますが、このユーザーの場合は User に関する管理が全て可能となっています。で、このユーザーに関しては、ユーザーに直接権限を付与するのではなく、Group のインスタンスに対して権限を付与し、そのインスタンスに所属することで間接的に権限を与えているという点が重要になります。このように、Group のインスタンスを作成しておけば、各ユーザーの権限付与は Group への所属によって行うことができます。

特にウェブアプリの運営者が多くなってきた場合、各ユーザーに個別に権限を与えるのも大変なので、Group を用意して一括で権限を設定する方が楽で良いと思います。

まとめ

このページでは、Django の管理画面自体について、さらには Django の管理画面の使い方について解説しました。

Django の管理画面では各モデルクラスのインスタンスの管理を行うことが出来ます。より具体的に言えば、モデルクラスのインスタンスの追加・削除・表示・編集等を行うことが出来ます。要はデータベースへの操作を行うことができるということになります。

ただし、こういった管理を一般ユーザーが行うとウェブアプリの運営が破綻してしまうことになるため、管理画面で行える管理はユーザーの種類に応じて制限されるようになっています。

特に最初に覚えておくべきはスーパーユーザーの存在で、このユーザーであれば管理画面での全ての管理を行うことが可能です。そして、このスーパーユーザーは createsuperuser コマンドによって作成することが出来ます。なので、管理画面を利用する際には、まずは createsuperuser を実行してスーパーユーザーを作成する必要があることは覚えておくと良いと思います。

この Django 入門の連載では、毎回解説内容に応じた掲示板ウェブアプリの開発手順についても解説しているのですが今回は省略しています。次の連載で管理画面のカスタマイズについて解説しますので、そこで掲示板ウェブアプリの管理画面についても解説させていただこうと思います。

その、次の連載は下記リンク先から読むことが出来ますので、是非こちらも読んでみていただければと思います!

【Django入門12】管理画面のカスタマイズ(ModelAdmin)

同じカテゴリのページ一覧を表示