1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

djangoの管理サイトについてまとめる

Posted at

管理サイトとは

レコードの追加や削除などを行うことのできるサイト。

djangoにおいてプロジェクトの作成時から用意されている。

サイトへのアクセスはadmin/というURLで行うことができる(urls.pyにて最初から定義されている)。

管理ユーザー

管理サイトにアクセスするためのアカウントは、以下のターミナルコマンドで作成することが一般的。

% python manage.py createsuperuser

上記のコマンドを実行するとユーザー名・メールアドレス・パスワードを聞かれるので、それらを入力すると権限ユーザーが作成される。

権限ユーザーとユーザーモデルの関係

管理サイトへログインするためのアカウント(=権限ユーザー)とdjangoアプリケーションを利用するためのアカウント(=ユーザーモデル)は別々の存在ではなく同じものである。

権限ユーザーの実態は、is_superuserという属性値がtrueのユーザーインスタンスであり、users = get_user_model().objects.all()などとした中にも含まれることになる。

逆に言えば、createsuperuserコマンドではなく管理サイトやアプリケーション内で作成したユーザーインスタンスであっても条件(後述)さえ満たせば管理サイトへのログインが可能。

管理サイトへのアクセス権限

上記の通り、通常の手順で作成したユーザーであっても特定の条件を満たせば管理サイトへのアクセスが可能。

その条件とは、「is_staff=trueもしくはis_superuser=true」である(is_staffis_superuserはいずれもAbstractUserクラスにデフォルトで用意されている)。

is_superuser=tureにしてしまうと全ての権限を持った状態になってしまうため、管理サイトへのログインのみを許可したい場合にはis_staff=trueを用いる。

管理サイトへのモデルの追加

最初に述べた通り管理サイトではレコードの追加・編集・削除などが可能であるが、これらの作業をするためにはまずそのモデルを管理サイトでの操作対象として追加する必要がある。

管理サイトでどのモデルを操作できるかは各アプリケーションフォルダごとのadmin.pyというファイルで定義されており、ここに以下のように記述することでそのモデルを管理者サイトで操作することが可能となる。

book/admin.py
from .models import Book

admin.site.register(Book)

admin.site.registerの引数として与えたモデルは管理サイトで扱えるようになる。

今回はBookというモデルを指定している。

管理サイトでできること

上記の手順でモデルを追加すると、そのモデルのレコードの一覧表示・追加・編集・削除が可能になる。

また、それら以外の操作を追加したり、一覧表示画面で表示される内容を変更することも可能(後述)。

管理サイトでのレコードの表示形式

管理サイトでレコードを一覧表示した場合のレコードの表示名はモデルごとの__str__メソッドの戻り値になる。

__str__メソッドを定義しなかった場合はモデル名 object(pk)となる。

レコード表示名の例
# Bookモデルに{ "id": 1, "title": "坊ちゃん", "author_name": "夏目漱石" }というレコードがあった場合。

# デフォルトの表示
# Book object(1)

# __str__メソッドを定義
def __str__(self):
  return f'{self.title}({self.author_name})'

# 表示名が以下に変更される
# 坊ちゃん(夏目漱石)

操作内容の追加

管理サイトで行える操作を追加したい場合の操作手順は以下の通り。

  • admin.ModelAdminクラスを継承したモデルを新しく定義する。
  • そのモデルのインスタンスメソッドとして、追加したい操作を定義する。
  • モデルの属性値actionsの値として、上記の関数を設定する。
  • モデルをadmin.site.registerの中に追加する。
admin.py
from django.contrib import admin
from .models import Campaign

class CampaignAdmin(admin.ModelAdmin):
  # 追加したい操作を関数として定義
  def hard_delete(self, request, queryset):
    queryset.delete(hard=True)
  # 関数を追加
  actions = [hard_delete]
  # 関数の表示名を設定
  hard_delete.short_desciption = "物理削除"

admin.site.register(Campaign, CampaignAdmin)

上記の例ではキャンペーンモデルの物理削除を登録しています。

管理サイトで選択したインスタンスがquerysetの中に入るので、それに対して処理を実行している形ですね。

余談ですが、論理削除を実装したモデルに関しては管理サイトでの削除も論理削除に置き換わるので、上記のように自分で物理削除を追加する必要があります。

表示内容の追加

レコードの一覧表示画面での表示形式は__str__メソッドで定義されているが、それとは別にlist_displayという属性値を用いて決定することも可能。

admin.py
from django.contrib import admin
from .models import Campaign

class CampaignAdmin(admin.ModelAdmin):
  def hard_delete(self, request, queryset):
    queryset.delete(hard=True)
  actions = [hard_delete]
  hard_delete.short_desciption = "物理削除"
  # 表示内容の設定(フィールド名を指定すれば良い)
  list_display = ["datetime", "order"]

admin.site.register(Campaign, CampaignAdmin)

初期状態の表示
Image from Gyazo

__str__メソッドで表示を変更
Image from Gyazo

list_displayを利用
Image from Gyazo

個人的な印象ですが、外部キーが絡む場合は__str__メソッドを用いた方が表示内容の自由度が高いかなと思います。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?