0
1

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 1 year has passed since last update.

Django 作成者 作成日時 更新者 更新日時を管理する

Posted at

環境

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での本人確認による解除

背景

管理画面にデータの作成者、更新者といった情報を追加し簡素な履歴管理を利用したかった。
image.png

ulid-py のインストール

データを管理するのにIDでの管理をしようと思い、また連番でもよいのだが、ソート可能なUUID互換のulidを今回は利用した
image.png

pipコマンドでインストールする
pip install ulid-py

django-currentuser のインストール

作成者、更新者が登録される際、それはログイン中のユーザとなる。
ユーザを取得するため以下をインストールする。
pip install django-currentuser

settings.pyにミドルウェアを登録する

mysite\settings.py
MIDDLEWARE = (
    ...,
    'django_currentuser.middleware.ThreadLocalUserMiddleware',
)

appの作成

Django appを作成する。pollsの部分はアプリケーション名で、何でもよい
今回はpollsとしたので変更された方は全体的に読み替えていただきたい
python manage.py startapp polls

settings.pyに作成したpollsを登録する

mysite\settings.py
INSTALLED_APPS = [
    ...,
    'polls',
]

appにModelを追加

polls\admin.py
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_dateauto_now_addであるのに対し、update_dateauto_nowであることに注意。

appを管理画面に追加

polls\admin.py
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に記載しておく必要がある
最終的に詳細画面はこのようになる(まだこの時点では表示できない)
image.png

appのマイグレーション

python manage.py makemigrations
image.png

python manage.py migrate
python manage.py runserver

動作確認

管理画面にログインするとpollsが追加されている
image.png

「POLLSを追加」から適当にデータを追加してみる
image.png

この段階では作成者=更新者である。
image.png

次に別のユーザでログインし直し、該当のデータを更新してみる
無事、更新者および更新日時が更新された(作成者、作成日時は更新されない)
image.png

注意

created_by, updated_by ともに admin.pysearch_fieldsには対応していないようである

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?