環境
Windows 11 Home
Python 3.10.2
Django 4.0.2
venv利用あり
(PyPI)
記事の中でインストールあり
条件:関連記事 第1回が完了していること
関連記事
Django 第1回:Django Custom User Model の作成
Django 第2回:Django 初回ログイン時にパスワード変更を強制する
Django 第3回:Django 一定期間パスワードを変更していないユーザにパスワード変更を強制する
Django 第4回:Django ランダムかつ有効期限のあるURLを生成し、上位者に承認してもらいアカウントを発行する
Django 第5回:Django パスワード試行回数ロックとランダムかつ有効期限付きURLでの本人確認による解除
背景
管理画面にデータの作成者、更新者といった情報を追加し簡素な履歴管理を利用したかった。
ulid-py のインストール
データを管理するのにIDでの管理をしようと思い、また連番でもよいのだが、ソート可能なUUID互換のulidを今回は利用した
pipコマンドでインストールする
pip install ulid-py
django-currentuser のインストール
作成者、更新者が登録される際、それはログイン中のユーザとなる。
ユーザを取得するため以下をインストールする。
pip install django-currentuser
settings.py
にミドルウェアを登録する
MIDDLEWARE = (
...,
'django_currentuser.middleware.ThreadLocalUserMiddleware',
)
appの作成
Django appを作成する。pollsの部分はアプリケーション名で、何でもよい
今回はpollsとしたので変更された方は全体的に読み替えていただきたい
python manage.py startapp polls
settings.py
に作成したpollsを登録する
INSTALLED_APPS = [
...,
'polls',
]
appにModelを追加
from django_currentuser.db.models import CurrentUserField
from django.db import models
import ulid
class Polls(models.Model):
id = models.CharField(primary_key=True, default=ulid.new, max_length=26, editable=False)
name = models.CharField(verbose_name="名前", max_length=50)
created_by = CurrentUserField(verbose_name="作成者", editable=False, related_name="create_polls")
create_date = models.DateTimeField(verbose_name="作成日時", auto_now_add=True)
updated_by = CurrentUserField(verbose_name="更新者", editable=False, related_name="update_polls", on_update=True, )
update_date = models.DateTimeField(verbose_name="更新日時", auto_now=True)
create_date
はauto_now_add
であるのに対し、update_date
はauto_now
であることに注意。
appを管理画面に追加
from django.contrib import admin
from .models import Polls
class PollsAdmin(Polls):
class Meta:
verbose_name = ("Polls")
verbose_name_plural = ("Polls")
@admin.register(PollsAdmin)
class PollsGroupAdmin(admin.ModelAdmin):
ordering = ["id",]
list_display = ["id", "name", "created_by", "create_date", "updated_by", "update_date"]
search_fields = ["id", "name"]
readonly_fields = ["id", "created_by", "create_date", "updated_by", "update_date"]
fieldsets = (
("基本情報", {
"fields":("id", "name", ),
}),
("更新履歴", {
"fields":("created_by", "create_date", "updated_by", "update_date", ),
}),
)
詳細画面、すなわちfieldsets
で表示させるには
created_by
, create_date
, updated_by
, update_date
が変更不可のため、readonly_fields
に記載しておく必要がある
最終的に詳細画面はこのようになる(まだこの時点では表示できない)
appのマイグレーション
python manage.py makemigrations
python manage.py migrate
python manage.py runserver
動作確認
次に別のユーザでログインし直し、該当のデータを更新してみる
無事、更新者および更新日時が更新された(作成者、作成日時は更新されない)
注意
created_by
, updated_by
ともに admin.py
のsearch_fields
には対応していないようである