このページでは、Django の管理画面(管理サイト)の使い方について解説を行なっていきます。
このページでは管理画面そのものや管理画面の使い方に焦点を当てて解説を行なっていますが、この管理画面はカスタマイズを行うこともでき、このカスタマイズに関しては次の連載となる下記ページで解説を行います。
【Django入門12】管理画面のカスタマイズ(ModelAdmin)Contents
管理画面とは
管理画面とは、ウェブアプリの管理者専用のユーザーインターフェースです。管理画面は、管理サイト・admin
ページ・admin
サイトと呼ばれることもあります。
管理画面は下の図のような見た目のページとなっています。この管理画面は、settings.py
での設定によって日本語化等も行うことができるのですが、このページではデフォルト設定のままの管理画面の図・文言を用いて説明していきます。
この管理画面は Django フレームワークから提供される機能の1つであり、この管理画面は Django で開発するウェブアプリにデフォルトで搭載されることになります。つまり、Django でウェブアプリを開発すれば、特別な設定等を行うことなく管理画面が利用可能です。
ですが、開発するウェブアプリに合わせて管理画面をカスタマイズする必要がある場合は、別途設定が必要となります。その設定を行う先のファイルが admin.py
となります。このカスタマイズに関しては、次の連載となる下記ページで解説を行います。
ちなみに、上記で「管理画面は Django で開発するウェブアプリにデフォルトで搭載される」と説明しましたが、デフォルトで搭載されるのは、プロジェクトの設定を行うファイルの settings.py
で定義する INSTALLED_APPS
に、デフォルトで django.contrib.admin
が指定されているからになります。この INSTALLED_APPS
から django.contrib.admin
を削除しない限り、管理画面を利用することは可能です。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
管理画面でできること
次は、この管理画面でできることについて説明していきます。
管理画面ではレコードの管理が可能
この管理画面では、モデルクラスのインスタンスの管理を行うことができます。下記ページで解説しているように、モデルクラスとはデータベースにおけるテーブルであり、そのインスタンスはそのテーブルにおけるレコードとなります。
【Django入門6】モデルの基本つまり、管理画面ではデータベースのテーブルにレコードを追加したり、レコードを編集したり、レコードを削除したりすることができます。
例えば、この Django 入門 の連載の中では掲示板ウェブアプリを開発しており、このアプリでは「コメント」の追加や「ユーザー」の登録を行うことができるようになっています。これらは、アプリのビュー・フォーム・テンプレートを利用してデータベースのテーブルへのレコードの追加を行なっていることになります。
それに対し、管理画面を利用することで、ビューやフォームやテンプレートを用意しなくても、レコードの追加や編集・削除等を行うことができます。
権限に応じたレコードの管理
また、先ほど挙げた掲示板アプリもそうなのですが、ウェブアプリにおいてはユーザーを管理するモデルクラスを定義することも多いです。この場合、このクラスのインスタンスがウェブアプリのユーザーとなります。ユーザーを管理するモデルクラスも当然モデルクラスの一種ですので、管理画面ではユーザーの管理も行うことができます。管理画面から「ユーザーの新規登録」も行うこともできますし、「ユーザーを無効化」したり、「ユーザーを削除」することで強制退会させるようなことも出来てしまいます。
ただ、このような管理が誰でも行えてしまうと、誰でも他のユーザーを強制退会させるようなこともできてしまうことになります。例えば気に入らないという理由で一般ユーザーが他のユーザーを削除して強制退会させるようなこともできてしまいます。これだとアプリの運営として破綻してしまいますね…。
そのため、この管理画面では、管理画面を利用中のユーザーの持つ権限に応じて操作可能なレコード管理が制限されるようになっています。なので、管理画面では、特定の権限を持つユーザーしかレコードの削除を行うことができず、上記のように “誰でもユーザーを強制退会させられる” ようなことはありません。また、そもそも、この管理画面を利用するためにはログインが必要となっています。そして、この管理画面へのログインに関しても、特定の権限を持ったユーザーのみがログイン可能となっています。このあたりの権限に関しては、後述の 管理画面とユーザー権限 で別途解説を行います。
上記のような、レコード管理が可能であったり、管理画面にログイン可能であったりするような権限はウェブアプリ開発者やウェブアプリ運営者にのみ付与されるようになっているため、通常のユーザーが他のユーザーの管理を行うようなことはできないようになっています。
つまり、管理画面はウェブアプリ開発者・運営者専用のユーザーインタフェースです。そして、このユーザーインタフェースからモデルのインスタンスの管理を行うことで、ウェブアプリを適切に運営していくことが可能になります。
スポンサーリンク
管理画面とユーザー
続いて、管理画面とユーザーとの関連について解説していきます。
管理画面とユーザー管理テーブル
前述の通り、管理画面を利用するためにはログインが必要となります。
このログインを行うログインフォームは下の図のようなものになります。
このログインでは、データベース内の「ユーザーを管理するテーブル」からログインフォームに入力されたユーザー名とパスワードが一致するレコードを探索し、探索に成功した&そのユーザーが特定の権限を持っている場合にログインに成功するようになっています。
権限を持つかどうかの判断が行われる点は異なるものの、この辺りのログインの流れは下記ページで解説しているものと基本的には同じです。要は、テーブルの探索を行なって認証が実施されることになります。
【Django入門10】ログイン機能の実現で、ここで重要なのは、管理画面にログインするためにはデータベース内には「ユーザーを管理するテーブル」が必要という点になります。Django においては、モデルクラス = テーブル
となりますので、ウェブアプリ内でユーザーを管理するモデルクラスが定義されていないと管理画面が利用できないことになります。さらに、そのテーブル内には特定の権限を持ったユーザーのインスタンスが存在していないとログインができず、管理画面も利用することはできません。
ウェブアプリによってはユーザーの管理が不要なものもあると思いますが、管理画面を利用するためにはユーザーを管理するためのモデルクラスが必ず必要となります
したがって、管理画面を利用するためには、まず「ユーザーを管理するモデルクラス」を定義する必要があることになります。また、ログインを実現するためには、このモデルクラスにはユーザー名やパスワードの管理機能が必要となりますし、権限に応じたレコードの管理 で説明した権限に応じたレコードの管理を実現するためには、このモデルクラスは権限の管理機能が必要となります。
カスタムユーザー
で、上記のような「ユーザーを管理するモデルクラス」の1つが、下記ページで解説した カスタムユーザー
になります。この カスタムユーザー
はユーザー名・パスワード・権限管理可能なモデルクラスとなっていますので、このモデルクラスを利用して管理画面の利用を実現することができます。
ただし、カスタムユーザー
は定義するだけではダメで、この定義した カスタムユーザー
で管理画面を利用するためには、プロジェクトの settings.py
に AUTH_USER_MODEL
の設定を追記する必要があります。
AUTH_USER_MODEL = 'アプリ名.カスタムユーザーのクラス名'
カスタムユーザー
を定義し、さらに上記のように AUTH_USER_MODEL
の設定の追記を行えば、管理画面を利用するユーザーとして カスタムユーザー
が適用されることになります。そして、カスタムユーザー
のテーブルに、ログインの権限を持つインスタンス(レコード)を作成しておけば、管理画面の利用が可能となります。
より具体的には、そのインスタンスのユーザー名・パスワードで管理画面へのログインを行い、管理画面でのレコードの管理を行うことができるようになります。そして、この管理画面で行えるレコードの操作は、そのログインしたユーザー(ユーザー名とパスワードを持つインスタンス)に設定された権限に応じて自動的に制限されることになります。
ここでは管理画面の説明に焦点を当てていますが、AUTH_USER_MODEL
の設定により、プロジェクト内で行うログイン時に利用するテーブルも AUTH_USER_MODEL
に指定したモデルクラスのものに変化することになります
このあたりは下記ページで解説していますので、詳細に関しては下記ページを参照してください
【Django入門10】ログイン機能の実現auth
の User
また、別に カスタムユーザー
を定義せず、さらに AUTH_USER_MODEL
の設定の追記を行わなくても、管理画面の利用は可能です。
settings.py
で AUTH_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
のテーブルがデータベース内に作成されることになります(Group
や Permission
といったテーブルも同時に作成されます)。
次に createsuperuser
で User
のテーブル内にスーパーユーザーをレコードとして作成することになりますが、事前にテーブルを作成していないとユーザーの作成に失敗することになるので注意してください。
スポンサーリンク
スーパーユーザーを作成する
ということで、次は 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/
すると、下の図のようなログインフォームが表示されるはずです。
ここは少し余談になるかもしれないですが、URL を指定することで管理画面(のログインフォーム)が表示されるのは、いつも開発しているウェブアプリと同様に urls.py
で URL と関数とがマッピングされているからになります。コメントは省略していますが、admintest
フォルダの下にある urls.py
は初期状態で下記のようになっており、通常の URL マッピングとは異なる書き方になっていますが、admin.site.urls
から実行されるメソッドの中で通常の URL マッピングと同様の書き方で urlpatterns
の定義が行われることになっています。
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
]
ということで、管理画面に関しても、私たちが開発するウェブアプリと同様の作りになっていますし、初期状態で上記のように urls.py
が作られているため、特に設定を行うことなく管理画面を利用することができるようになっています。
ちょっと話が横道にそれましたが、次は先ほど表示されたログインフォームにユーザー名とパスワードを入力して Log in
ボタンをクリックしましょう!ここで入力するユーザー名とパスワードは、先ほど作成したスーパーユーザーのものになります。
ログインに成功すれば下の図のようなページに遷移するはずです。これが管理画面のトップページであり、ここで様々なモデルのインスタンスの管理を行うことができるようになっています。そして、現在はスーパーユーザーでログインしているため、どんな管理も行うことができるようになっています。
スポンサーリンク
管理画面でインスタンスの管理を行う
といっても、現状管理画面から管理可能なモデルクラスは User
と Group
のみとなります。ただ、管理可能なモデルクラスは追加することが可能で、その追加方法については次の連載となる下記ページで解説を行います。
他のモデルクラスに対し、これらの User
と Group
は特別な存在のモデルクラスになります。それは、これらのモデルクラスがユーザーの権限を管理する機能を持つモデルクラスになるからです。なので、他のモデルクラスに比べて、これらのクラスのインスタンスの管理は若干ややこしいです。といっても、権限の管理の面を除けば、基本的な各モデルクラスのインスタンスの管理方法は同じですので、ここでまず User
に対するインスタンスの管理方法について理解しておきましょう。
また、管理画面はカスタマイズが可能で、admin.py
というファイルを編集することで、このカスタマイズを行うことが可能となります。もう少し具体的に言えば、各モデルクラスに対し、追加フォーム等に表示するフィールドや一覧に表示するフィールドなどをカスタマイズすることができます。
管理画面の具体的なカスタマイズ方法については上記の次の連載のページで説明を行うことになりますが、ここでもカスタマイズ可能な箇所について補足を入れながら解説を行なっていきたいと思います。
インスタンスの表示
では、まずは User
のインスタンスの表示を行なっていきたいと思います。
現状、管理画面のトップページが表示されていると思います。この管理画面の左側には、アプリ毎にモデルクラスの一覧が表示されています。緑色っぽい背景(色は異なる可能性があります)に記載されているのがアプリに対応する名称になり、その下側に表示されているのが、そのアプリで定義されているモデルクラスの一覧となります。で、ここで表示されているものが、管理画面から管理可能なモデルクラスとなります。
例えば下の図で言えば、AUTHENTICATION AND AUTHORIZATION
がアプリの名称を示しており、その下側に表示されている Groups
と Users
がモデルクラスの名称を表しています。
これらは具体的には、settings.py
の INSTALLED_APPS
に登録されている django.contrib.auth
で定義されているモデルクラスの一覧となります。実際に定義されているのは Group
と User
になりますが、管理画面上にはモデルクラス名に s
が付加された形で、つまり複数形で名称が表示されることになります。
これと同様に、管理画面のカスタマイズを行うことで、自身で開発しているアプリに定義したモデルクラスも管理画面に表示することができ、そのモデルクラスのインスタンスを管理することができるようになります。で、この方法については次の連載で解説するとして、ここでは User
のインスタンスの管理を行なっていきましょう!
まずは、User
のインスタンスの一覧を表示したいと思います。この一覧は、下の図のオレンジ枠で示す Users
リンクをクリックすることで表示することができます。
すると、ページが遷移して下の図のような一覧表が表示されると思います。これが User
のインスタンスの一覧となります。トップページで Users
ではなく Groups
リンクをクリックした場合は、Groups
のインスタンス一覧が表示されることになります。
Django において、モデルクラスはテーブルであり、インスタンスはそのテーブルのレコードとなります。つまり、上の図では、テーブル内のレコードの一覧が表示されていることになります。
現状、User
のテーブルには、createsuperuser
コマンドで追加した1つのインスタンス(レコード)しか存在しないため、上の図のように1つのインスタンスの情報のみが表示されているはずです。今後、インスタンスの追加を行うことで、この一覧に表示されるインスタンスが増えていくことになります。
また、この一覧では USERNAME
・EMAIL ADDRESS
・FIRST NAME
・LAST NAME
・STAFF STATUS
という5つの項目が表示されていますが、これらの表示項目もカスタマイズすることが可能です。
インスタンスの編集
続いて、既に存在している User
のインスタンスの編集を行なっていきたいと思います。
先ほど表示された一覧表では、USERNAME
フィールドの項目にリンクが設定されています。情報を編集したいユーザーの USERNAME
の項目のリンクをクリックすれば、そのインスタンスの編集フォームが表示されることになります。
表示されるのが下図のようなフォームとなり、ここでインスタンスの情報を編集し、最後にページ最下部にある SAVE
ボタンをクリックすることで、その編集を反映、すなわちインスタンスの編集を行うことができます。
例えば、First name
フィールドと Last name
フィールドに情報を入力して SAVE
ボタンをクリックすれば、インスタンスが更新され、インスタンスの一覧表に入力した FIRST NAME
と LAST NAME
が表示されるようになることが確認できると思います。
このように、管理画面ではインスタンスの編集を行うことができます。
さて、先ほどインスタンスの編集フォームが表示されましたが、ここで入力可能なフィールドはどのようにして決まるのでしょうか?
これらの入力可能なフィールドは基本的に User
モデルクラスの持つフィールドになります。例えば先ほど変更した First name
フィールドと Last name
フィールドは User
モデルクラスの持つフィールドです(User
は first_name
フィールドと last_name
フィールドを持っている)。つまり、編集フォームはモデルクラスの持つフィールドに応じて生成されることになります。なので、User
とは異なるモデルクラスの編集フォームは先ほど表示されたものとは違うことになります。
例えば Group
の編集フォームは下の図のようなものであり、User
とは全くこのとなるものであることが確認できると思います。
また、カスタマイズを行うことで、この編集フォームに表示されるフィールドを変更することも可能です。例えば、User
の編集フォームから First name
フィールドと Last name
フィールドを消すようなことも可能です。
編集フォームがモデルクラスごとに異なるように、管理画面のカスタマイズもモデルクラス単位で行っていくことになります。これは編集フォームだけでなく、追加フォームやユーザの一覧表の項目なども同様です。
インスタンスの追加
次は、User
のインスタンスの追加を行なっていきます。
User
のインスタンスの追加フォームは、インスタンス一覧表示ページの下の図のオレンジ枠で示す ADD USER
ボタンをクリックすることで表示することができます。
クリックすれば、下の図のようなフォームが表示されますので、ここでユーザー名とパスワード(2回)を入力して SAVE
ボタンをクリックすることでインスタンスの追加を行うことができます。また、ここで入力受付を行うフィールドの追加も、カスタマイズを行うことで変更することが可能です。
SAVE
ボタンをクリックすれば編集フォームが表示されますので、ここで情報を再度編集することも可能です。ですが、今回は何も編集を行わず、ページ最下部の SAVE
ボタンをクリックしてください。
SAVE
ボタンをクリックすれば、再度インスタンスの一覧が表示されることになり、そこに先ほど追加したユーザーが表示されていることが確認できると思います。
インスタンスの削除
次はインスタンスの削除を行なっていきます。
インスタンスの削除は、インスタンスの一覧から削除したいユーザーにチェックを入れ、一覧の上側にある Action
リストから Delete selected users
を選択して Go
ボタンをクリックすることで行うことができます。
今回は、先ほど追加を行なったインスタンス、つまりスーパーユーザーでない方のインスタンスにチェックを入れて削除を行なってください。
確認画面が表示されるので、Yes, I'm sure
ボタンをクリックすれば、再度 User
の一覧が表示され、削除したインスタンスが一覧から消えていることが確認できると思います。これはつまりテーブルからレコードが削除されたことを意味します。
ここまで説明してきた通り、管理画面からはインスタンスの追加・表示・編集・削除を行うことができます。よりデータベースっぽい言葉を使えば、管理画面から CRUD 操作(Create・Read・Update・Delete)を行うことができます。
また、今回は User
を利用して説明を行いましたが、他のモデルクラスの場合も同様の手順でインスタンスの追加・表示・編集・削除を行うことができます。ただし、各種フォームに表示されるフィールドはモデルクラスに応じて異なるので、その点はご注意ください。また、管理画面で管理可能なモデルクラスの追加方法については次の連載となる下記ページで解説を行います。
管理画面で権限の管理を行う
次は、管理画面での権限についての説明を行なっていきます。
管理画面とユーザー権限 で説明した通り、ユーザーには下記の3種類のものが存在し、この種類によって付与される管理権限が異なることになります。
- スーパーユーザー
- ノーマルユーザー
- スタッフユーザー
また、特にスタッフユーザーを特定のグループに所属させることで、グループに応じた権限を付与することもできます。
ただし、これらの権限管理は django.contrib.auth
で定義される User
や Group
のみが持つ機能であり、権限管理の考え方は基本的には他の通常のモデルクラスには存在しないものとなるので注意してください。もう少し具体的に言えば、権限の管理は AbstractUser
というクラスによって提供されます。したがって、ここで説明する権限管理を行いたいのであれば、これらのクラスのサブクラスとしてモデルクラスを定義する必要があります。
例えば User
は AbstractUser
のサブクラスとして定義されているため、ここで説明する権限管理を行うことができるようになっています。したがって、ユーザーを管理するモデルを User
ではなく独自に定義したモデルクラスとしたい場合でも、権限管理を行うのであれば AbstractUser
のサブクラスとして定義する必要があります。逆に言えば、AbstractUser
のサブクラスとして定義してやれば、User
を利用しなくても管理画面での権限管理を行うことができるようになります。そして、その一例が カスタムユーザー
になります。
権限管理の機能は PermissionsMixin
というクラスで定義されていますので、これを継承したクラスを定義するのでも良いです
AbstractUser
が権限の管理を行うことができるのも、この PermissionsMixin
を継承していることが理由となります
少し話は逸れましたが、重要な点をまとめておくと、ここで説明する権限管理については django.contrib.auth
で定義される User
(AbstractUser
等を含む) や Group
に特化したものであるという点になります。
管理権限の確認のためのユーザー追加
ということで、次は管理画面を利用しながら各種ユーザーの違いを確認していきたいと思います。
現状、スーパーユーザーで管理画面にログインしている状態になっており、ここまでの説明の通り、このユーザーでは管理画面での全ての管理を行うことができるようになっています。実際に先ほどの解説の中で、インスタンスの追加・表示・編集・削除が行えることを手順を実施しながら確認していただいたと思います。
続いて、スーパーユーザー以外のユーザーの管理画面での権限を確認していきたいと思います。そのために5つの User
のインスタンスを作成していきます。
まず、User
のインスタンス一覧を表示し、ADD USER
ボタンをクリックしてください。そして、表示されるフォームのユーザー名に NormalUser
という名前を入力し、パスワードには yh123456
をを入力して SAVE
ボタンをクリックしてください。さらに、次に表示される編集フォームでは何も編集は行わず、ページ最下部の SAVE
ボタンをクリックしてください。
これで一人のユーザーが追加されたことになります。同様の手順で、StaffUser_no
、StaffUser_add
、StaffUser_del
、StaffUser_group
というユーザー名の4つの User
のインスタンスを追加してください。
補足しておくと、ここでは権限の確認を行なっていくことが目的であるため、パスワードはなんでも良いです
ただし、今後の説明の中でパスワードを入力する機会があるため、パスワードは覚えやすいものにしておいてください
ここでは全ユーザーのパスワードが yh123456
であるものとして説明をしていきたいと思います
追加したユーザーは、User
のインスタンス一覧に表示されているはずです。そして、一番右側の STAFF STATUS
がスタッフユーザーであるかどうかを示す列になります。ここからの手順で、特定のユーザーをスタッフユーザーに指定していきます。
では、各ユーザーに権限の付与を行なっていきます。
一人目の NormalUser
はノーマルユーザーとして扱っていきたいので、権限の付与は行いません。
二人目の StaffUser_no
はスタッフユーザーとして扱うようにしていきます。ただし、スタッフユーザーに設定するだけで、権限の付与は行いません。
このような権限付与は、編集フォームで下図で示す Staff status
チェックボックスにチェックを入れるだけで実現することができます。つまり、下記のチェックボックスチェックを入れるだけで、そのユーザーをスタッフユーザーに設定することができます。チェックを入れた後にページ最下部の SAVE
ボタンを押すのを忘れないようにしてください。
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
モデルクラスに対して add
と change
と view
、すなわち 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
リンクをクリックしてください。
そうすると、下の図のようなフォームが表示されることになります。
ご覧の通り、User
の編集フォームと同様に権限付与設定が行えるようになっていることが確認できると思います。また、User
の時とは追加フォームに表示されるフィールドが異なっており、モデルクラス毎に異なる追加フォームが表示されることも確認できると思います。
ここでは下の図のように Name
に UserAdministrator
を入力し、さらに Permissions
フィールドの Chosen permissions
に auth | user
関連の権限全てを設定して SAVE
ボタンをクリックしてください。
これにより、Group
のインスタンスが追加され、追加したインスタンスが Group
の一覧表に表示されていることが確認できると思います。そして、このインスタンスは、先ほどの追加フォームで設定した通り、User
関連の権限全てを持つグループとなります。そして、この Group
のインスタンスに所属する User
は Group
と同じ権限が付与されることになります。
ということで、次は User
のインスタンスである StaffUser_group
を、先ほど作成した UserAdministrator
に所属させるようにしていきましょう!
まずは、User
の一覧表を表示し、StaffUser_group
というリンクをクリックしてください。User
の一覧表は、ページ最上部の Django administration
をクリックしてトップページを表示し、さらにそのトップページの Users
リンクをクリックすることで表示することができます。
続いて、StaffUser_group
の編集を行なっていきます。このユーザーもスタッフユーザーとして設定するために Staff status
のチェックボックスにチェックを入れます。さらに、次は Groups
フィールドで Chosen groups
に先ほど追加した UserAdministrator
を設定して SAVE
をクリックします。設定方法は User permissions
フィールドと同様なので、ここでは説明を省略します。
これにより、StaffUser_group
が UserAdministrator
に所属することになり、UserAdministrator
の持つ権限が StaffUser_group
にも与えられたことになります。ということで、これで5人目の StaffUser_group
の用意も完了したことになります。
少し補足しておくと、ここでいう「所属する・所属させる」とは、要は2つのインスタンスが関連付けされていることを言っています。User
には ManyToManyField
が存在し、これによって User
のインスタンスと Group
のインスタンスとを関連付けできるようになっています。ManyToManyField
なので、User
のインスタンスと Group
のインスタンスとは多対多の関連付けが可能ということになります。この辺りのリレーションに関しては下記ページで解説していますので、詳しく知りたい方は下記ページをご参照ください。
また、今回の場合、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
になるかと思います。もしかしたらユーザー名は異なるかもしれませんが、いずれにせよスーパーユーザーのインスタンスでログインをしているため、特に設定もすることなく User
や Group
のインスタンスの作成等が行えていました。このように、スーパーユーザーは管理画面での全ての管理の権限を持つユーザーとなります。
このスーパーユーザーは 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
リンクが消えていることになります。
StaffUser_add
は User
に対する追加・編集・表示の権限を持つユーザーとなります。そのため、これらの管理を行うためのリンクに関しては画面に表示されています。しかし、Group
に対する権限は持っていないため、管理不可な Group
に関するリンクは表示されていません。
このように、管理画面はログインしたユーザーの権限に応じて変化するように作成されています。
また、StaffUser_add
は User
に対する追加・編集の権限を持っているため、管理画面でインスタンスの管理を行う で示した手順でインスタンスの追加や編集が行えることも確認できると思います。
ですが、削除の権限は持っていないため、削除は実施できません。例えば、スーパーユーザーでログインしていた場合は 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)