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

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

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

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

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

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

管理画面とは

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

管理画面はデフォルト設定で下の図のような見た目のページとなっています。もしかしたら色味は違うかもしれないです。

管理画面の紹介図

例えば、管理画面の日本語化などを settings.py で行うこともできますが、このページではデフォルト設定のままの管理画面の図・文言を用いて説明していきます。

管理画面でできること

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

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

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

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

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

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

それに対し、管理画面を利用することで、ビューやフォームやテンプレートを用意しなくてもレコードの追加、さらには編集や削除等を行うことができます。ただし、管理画面でできることは基本的にモデルクラスのインスタンスの管理のみとなるので注意してください。

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

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

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

そのため、この管理画面を利用するためにはログインが必要となっています。そして、この管理画面へのログインは誰でも行えるというわけではなく、特定の権限を持ったユーザーのみがログイン可能となっています。そういった権限はウェブアプリ開発者やウェブアプリ運営者にのみ付与されるようになっているため、通常のユーザーが他のユーザーの管理を行うようなことはできないようになっています。

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

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

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

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

スポンサーリンク

管理画面とユーザー

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

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

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

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

Djangoのログインフォーム

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

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

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

Djangoのウェブアプリに対するログイン機能搭載手順の説明ページアイキャッチ 【Django入門9】アプリにログイン機能を搭載する

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

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

したがって、管理画面を利用するためには、まずユーザーを管理するモデルクラスを定義する必要があることになります。

authUser

ですが、安心してください。Django でウェブアプリを開発する際には、自動的にユーザーを管理するモデルとして User というモデルクラスが定義されることになります。この Userdjango.contrib.auth というアプリから提供されるモデルクラスであり、settings.pyINSTALLED_APPS にデフォルトで django.contrib.auth が指定されているため、この User が自動的にウェブアプリで利用可能となっています。

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

この settings.pystartproject コマンドを実行すれば自動的に生成されますので、startproject コマンドを実行し、さらに migrate コマンドでマイグレーションを実行すれば、User モデルクラスに基づいてデータベース内に「ユーザーを管理するテーブル」が作成されることになります。

さらに、Django には createsuperuser というコマンドが用意されており、このコマンドの実行によってスーパーユーザー権限を持ったユーザーを「ユーザーを管理するテーブル」内に作成することができます。

なので、下記の4つの Django のコマンドを実行さえすれば、管理画面へのログインができる準備が整うことになります。最後の runserver は開発用ウェブサーバーを起動するために必要になります。

  • startproject
  • migrate
  • createsuperuser
  • runserver

ただ、上記コマンドだけではアプリが作成されませんし、アプリ内の models.py で定義したモデルクラスに対応するテーブルがデータベースには作成されません。なので、通常は上記コマンドに加えて startapp コマンドや makemigrations コマンドも実行する必要があるのですが、管理画面へのログインを行うための準備として必須なのは上記の4つのコマンドのみとなります。

ちなみに、管理画面がデフォルトで利用可能なのは、前述で示した INSTALLED_APPS にデフォルトで django.contrib.admin が指定されているからになります。

User 以外のユーザー管理モデルの利用

先ほどは User を利用して管理画面にログインすることを前提とした説明をしましたが、User 以外のユーザー管理モデルクラスを利用してログインを行うことも可能です。

前述の通り、ログイン時にはユーザー管理テーブル内の探索によって認証が実施されるになりますが、この探索先となるテーブルは settings.py で変更可能です。より具体的には、settings.py での AUTH_USER_MODEL の指定によって、探索先のテーブルを指定することが可能です。実際には、AUTH_USER_MODEL に指定するのはモデルクラスになりますが、このモデルクラスがテーブルに対応しているので実質的にはテーブルを指定するのと同じことになります。

authUser が管理画面でのログイン時に利用されるのは、この AUTH_USER_MODEL のデフォルト設定が下記のようになっているからになります。

AUTH_USER_MODELのデフォルト設定
AUTH_USER_MODEL = "auth.User"

つまり、AUTH_USER_MODEL のデフォルト設定を変更してやれば、User 以外のモデルクラスを利用して管理画面へのログインを行うことができるようになります。

例えば、前回の連載の下記ページで掲示板アプリへのログイン機能搭載の手順を説明しましたが、

Djangoのウェブアプリに対するログイン機能搭載手順の説明ページアイキャッチ 【Django入門9】アプリにログイン機能を搭載する

この手順の中で下記のように settings.py で AUTH_USER_MODEL の指定を行なっています。そのため、管理画面へのログイン時には forum というアプリの CustomUser というモデルクラスに対応するテーブルを利用して認証が行われることになります。

AUTH_USER_MODELの変更例
AUTH_USER_MODEL = 'forum.CustomUser'

また、ここまで管理画面へのログイン時に利用されるモデルクラスに焦点を当てて解説してきましたが、実は、AUTH_USER_MODEL は「プロジェクト全体に対するログイン時に利用されるモデルクラス」を指定する設定となります。

つまり、settings.pyAUTH_USER_MODEL を指定しておけば、そのプロジェクト内でのログインでは全て、AUTH_USER_MODEL に指定されたモデルクラスのテーブルを利用して認証が行われることになります。

ただし、管理画面へのログインを行う際には単なる認証ではなく、権限が付与されているかどうかの確認も行われることになりますので、管理画面を利用したい場合は AUTH_USER_MODEL には権限の設定が可能なモデルクラスを指定する必要があります。権限の設定が可能なモデルクラスは AbstractUserPermissionsMixin を継承して定義することで簡単に実現できます。特に AbstractUser を継承してモデルクラスを定義するやり方に関しては下記ページでも解説していますので、詳しくは下記ページを参照していただければと思います。

【Django】カスタムユーザー(独自のユーザー)の作り方【AbstractUser編】

このページでは AUTH_USER_MODEL の変更は行いませんが、AUTH_USER_MODEL を変更することで、管理画面へのログイン時に利用されるテーブルも変化することは覚えておいてください。

管理画面とユーザー権限

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

前述の通り、管理画面にログインできるのは特定の権限を持ったユーザーのみとなります。先ほど紹介した createsuperuser コマンドで作成されるスーパーユーザーと呼ばれる種類のユーザーであり、このユーザーは、その特定の権限を持ったユーザーとなります。なので、createsuperuser コマンドで作成されたユーザーのユーザー名とパスワードを入力すれば管理画面にログインを行うことが出来ます。そして、このユーザーの場合、管理画面で全ての管理を行うことができるようになっています。

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

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

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

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

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

スーパーユーザー

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

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

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

ノーマルユーザー

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

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

スタッフユーザー

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

より具体的にいうと、スタッフユーザーに設定されたユーザーは管理画面へのログイン自体は可能です。ですが、権限が全く与えられていないと管理画面での管理が全く行えません。ですが、スーパーユーザー等から権限が与えられれば、その権限内での管理を管理画面から行うことができるようになります。

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

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

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

逆に、前述のスーパーユーザーは管理画面での全権限が付与されていますが、ログインを行うためにはスタッフユーザーでもある必要があります。

グループ

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

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

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

スポンサーリンク

管理画面の使い方

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

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

プロジェクトを作成する

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

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

% django-admin startproject admintest

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

データベースを作成する

続いてデータベースを作成していきます。まず、先ほど作成された admintest フォルダの中に移動し、下記コマンドを実行してマイグレーションを実行しましょう!

% python manage.py migrate

これにより、INSTALLED_APPS に指定されているアプリで定義されているモデルのテーブルがデータベース内に作成されることになります。そして、INSTALLED_APPS には django.contrib.auth が指定されているため、User クラスに対応するテーブルも作成されることになります。

次に 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入門11】管理画面のカスタマイズ(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入門11】管理画面のカスタマイズ(ModelAdmin)

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

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

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

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

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

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

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

MEMO

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

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

この AbstractUser を利用したユーザー管理モデルの定義方法については下記ページで解説していますので、興味があればこちらを読んでみてください。

【Django】カスタムユーザー(独自のユーザー)の作り方【AbstractUser編】

少し話は逸れましたが、重要な点をまとめておくと、ここで説明する権限管理については 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 のインスタンス一覧には、下図のように合計6つのインスタンスが表示されることになります。一番右側の 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 が存在し、これによって Group との間にリレーションが設定されています。ManyToManyField なので、UserGroup の間には多対多のリレーションが設定されていることになります。この辺りのリレーションに関しては下記ページで解説していますので、詳しく知りたい方は下記ページをご参照ください。

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入門11】管理画面のカスタマイズ(ModelAdmin)

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