Хранить, кто обновил модель Django Model из админки

У меня есть сценарий использования, в котором данные вставляются и обновляются только из админки django. Сейчас у меня есть несколько пользователей, которые имеют доступ к странице django admin. Я хочу иметь возможность хранить информацию о том, кто именно обновил или создал запись на странице django admin.

В идеале, я хочу добавить отдельный столбец к существующей модели.

models.py

class Links(models.Model):
    link = models.URLField(unique=True)
    created_at = models.DateTimeField(auto_now_add=True)
    created_by = model.ForeignKey(UserModel)
    updated_at = models.DateTimeField(auto_now=True)
    updated_by = model.ForeignKey(UserModel)

Вы можете переопределить метод .save_model(…) [Django-doc] для установки полей .updated_by и .created_by в зависимости от того, change это True или False:

from django.contrib import admin

class LinkAdmin(admin.ModelAdmin):
    
    def save_model(self, request, obj, form, change):
        if not change:
            obj.created_by = request.user
        obj.updated_by = request.user
        return super().save_model(request, obj, form, change)

admin.site.register(Links, LinkAdmin)

Если вам нужно это для большого количества моделей, вы можете сделать миксин, а затем использовать его для всех видов моделей:

class CreateUpdateUserAdminMixin:
    
    def save_model(self, request, obj, form, change):
        if not change:
            obj.created_by = request.user
        obj.updated_by = request.user
        return super().save_model(request, obj, form, change)

и затем использовать миксин с:

class LinkAdmin(CreateUpdateUserAdminMixin, admin.ModelAdmin):
    pass

class OtherModelAdmin(CreateUpdateUserAdminMixin, admin.ModelAdmin):
    pass

admin.site.register(Links, LinkAdmin)
admin.site.register(OtherModel, OtherModelAdmin)

Примечание: обычно модели Django присваивается сингулярное имя, поэтому Link вместо Links.

Вернуться на верх