Для моделей с метками времени вы, вероятно, захотите взглянуть на django-model-utils или django-extensions . Каждый из них включает абстрактные базовые классы, которые автоматически обрабатывают созданную и последнюю измененную временную метку. Вы можете использовать эти инструменты напрямую или посмотреть, как они решили проблему, и найти собственное решение.
Что касается других ваших вопросов:
Можете ли вы сделать что-то вроде @login_required, например @ Audit_changes
Потенциально, да, но вы должны быть очень осторожны, чтобы обеспечить безопасность потоков. Что вы могли бы сделать - это в своем декораторе @audit_changes установить флаг, чтобы включить аудит в локальном потоке. Затем либо в методе сохранения ваших моделей, либо в обработчике сигналов вы можете проверить свой флаг аудита и записать данные аудита, если этот флаг был установлен.
Можете ли вы получить доступ к запросу и текущему пользователю в модели и централизовать логику там?
Да, но вы сделаете компромисс. Как вы уже коснулись, существует очень четкое и преднамеренное разделение проблем между ORM Django и его битами обработки запросов / аутентификации. Есть два способа получить информацию из запроса (текущего пользователя) в ORM (ваши модели). Вы можете вручную управлять обновлением информации о создателе / модификаторе своих объектов или настроить механизм для автоматической обработки этих работ по обслуживанию. Если вы выберете ручной подход (передача информации через вызовы методов из запроса в представлении в ORM), это будет больше кода для поддержки / тестирования, но вы сохраните разделение проблем на месте. При ручном подходе вы будете в гораздо лучшей форме, если вам когда-нибудь придется работать с вашими объектами вне цикла запрос / ответ (например, cron-скрипты, отложенные задачи, интерактивная оболочка). Если вы согласны с тем, чтобы устранить это разделение интересов, то вы можете настроить что-то, где вы установите локальный поток с текущим пользователем в промежуточном программном обеспечении, а затем посмотреть на этот локальный поток в методе сохранения вашей модели. В противоположность ручному подходу, у вас будет меньше кода для работы, но вам будет гораздо труднее, если вы когда-нибудь захотите работать с вашими объектами вне цикла запрос / ответ. Кроме того, вам нужно быть очень осторожным, чтобы сохранить все потоки с более автоматизированным подходом.