haku-maiのブログ

インフラエンジニアですが、アプリも作ります。

【Django3.1】DjangoAdminの使い方

f:id:n-guitar:20210111025546p:plain:w800

本記事で行うこと

  • Djangoでdefaultで用意されているDjangoAdminの使い方について記載しておく。

なお本記事のソースコードgithub上に公開しています。

GitHub - n-guitar/django-samples at feature/django-admin/sample.generic-view

モチベーション

  • Djangoを教える時のサンプルとして利用したいため。

環境

$ sw_vers
ProductName:    macOS
ProductVersion: 11.1
BuildVersion:   20C69
$ python -V
Python 3.8.0

事前準備

pyenv環境

$ python -m venv env
$ source env/bin/activate
$ export PATH=$PWD/env/bin:$PATH

Djangoのインストール

$ pip install django==3.1.3

sample アプリケーション

以下記事で作成したものを利用します。 n-guitar.hatenablog.com

※必要に応じて上記のアプリケーションをcloneしておく

$ git clone -b sample.generic-view https://github.com/n-guitar/django-samples.git

Django Adminとは

Djangoで予め用意されている、管理インターフェースで簡単にユーザ管理を行える管理サイトを利用できる。
また作成したdatabase tabelもdefaultで作成されるadmin.pyに登録するだけで管理サイトから操作出来るようになる。

Django Adminの有効化(参考:読み飛ばして問題なし)

実はdefaultで有効化されており、利用をするために特別は努力はいらない。
が参考までに、利用するために必要な条件を記載しておく。

confug/settings.py

INSTALLED_APPS = [
    'django.contrib.admin', # 記述されていること
    'django.contrib.auth', # 記述されていること
    'django.contrib.contenttypes', # 記述されていること
    'django.contrib.sessions', # 記述されていること
    'django.contrib.messages', # 記述されていること
   <省略>
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware', # 記述されていること
    'django.contrib.messages.middleware.MessageMiddleware', # 記述されていること
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth', # 記述されていること
                'django.contrib.messages.context_processors.messages', # 記述されていること
            ],
        },
    },
]

confug/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls), # 記述されていること
    path('samplecrud/', include('samplecrud.urls')), 
]

実はdefaultでurlの設定もされている。
この状態で、run serverして

$ python manage.py runserver

http://127.0.0.1:8000/admin にアクセスして以下が表示されればOK f:id:n-guitar:20210111020932p:plain:w600

この次にこの管理サイトを利用する管理ユーザの作成を行う。

データベースのマイグレーションと管理ユーザの作成

データベースのマイグレーション

まずdefaultで用意されている管理用テーブルのマイグレーションを行う。

$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, samplecrud, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying samplecrud.0001_initial... OK
  Applying sessions.0001_initial... OK

samplecrud.0001_initial以外はdefaultで用意されている管理用テーブル。
samplecrud.0001_initialは上記のサンプルアプリケーションをgit cloneした場合のみ一緒にマイグレーションされる。
これで管理用テーブルが作成されたので、以下のコマンドで管理ユーザの作成を行う。

管理ユーザの作成

当然本番環境で利用する際はpassword管理は注意する必要があるが、開発時は適応で問題有りません。

$ python manage.py createsuperuser
Username (leave blank to use 'XXXXX'): admin
Email address: test@test.com                            
Password: 
Password (again): 
Superuser created successfully.

この状態で、run serverして

$ python manage.py runserver

http://127.0.0.1:8000/admin にアクセスして作成した管理ユーザでログインすると以下の管理サイトを利用できる用になる。 f:id:n-guitar:20210111022121p:plain:w600
f:id:n-guitar:20210111022149p:plain:w600
ここからユーザやグループの管理が行える。 f:id:n-guitar:20210111022303p:plain:w600
f:id:n-guitar:20210111022422p:plain:w600

任意のモデル(テーブル)を登録

アプリケーションで作成した任意のモデル(テーブル)をこの管理サイトに登録し、簡易的なテーブルの操作が行えるようになる。
登録方法は簡単で以下の用に記述するだけ。

samplecrud/admin.py

from django.contrib import admin
from .models import Todo # 追記

admin.site.register(Todo) # 追記

この状態で再び、 http://127.0.0.1:8000/admin にアクセスすると、テーブルを操作出来る。

Todosが表示されており、レコード追加できる。

f:id:n-guitar:20210111023039p:plain:w600
f:id:n-guitar:20210111023511p:plain:w600
f:id:n-guitar:20210111023540p:plain:w600
f:id:n-guitar:20210111023612p:plain:w600

この状態で、 http://127.0.0.1:8000/samplecrud/list/ にアクセスして作成したListViewで見てみると追加したレコードが表示されていることがわかる。
f:id:n-guitar:20210111023732p:plain:w600

余談ではあるが、DjangoでModelを作成するとdefaultで複数形になる。 正しい複数形ではなくsが不自然につく場合のほうが多いが、ModelのMeta Optionを使えば変更出来る。
- 公式document Model Meta options | Django documentation | Django

以上、DjangoAdminの使い方でした。