У себя в проектах долгое время делал так:
1. Модель со всеми общими полями для аудита:
models.py
class Audit(models.Model):
"""
A common class for auditing the models' instances.
"""
created_by = models.ForeignKey(
User,
related_name='%(app_label)s_%(class)s_created_related',
verbose_name=_(u'Создал'),
on_delete=models.SET_NULL,
blank=True, null=True)
changed_by = models.ForeignKey(
User,
related_name='%(app_label)s_%(class)s_changed_related',
verbose_name=_(u'Изменил'),
on_delete=models.SET_NULL,
blank=True, null=True)
created = models.DateTimeField(
_(u'Дата создания'), auto_now_add=True)
changed = models.DateTimeField(
_(u'Дата изменения'), auto_now=True)
class Meta:
abstract = True
2. Для админки:
admin.py
class AuditAdmin(admin.ModelAdmin):
"""
Admin class for audit fields
"""
readonly_fields = (
'created_by',
'changed_by',
'created',
'changed')
fieldsets_preset = (
_(u'Прочее'), {
'fields': (
'created_by',
'created',
'changed_by',
'changed'
)
})
actions_on_top = True
def save_model(self, request, obj, form, change):
if not change:
obj.created_by = request.user
obj.changed_by = request.user
obj.save()
Наследуем все модели и админ-классы, для которых необходимо следить за пользователями, и радуемся.
Это решение перестало меня удовлетворять, как только моделей стало слишком много -- список related отношений для класса User стал просто невыносим. Работаю над переходом к хранению логина пользователя в текстовом виде вместо внешнего ключа на пользователя.