Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to implement Django model audit trail? How do you access logged in user in models save() method?

Tags:

django

I want to keep track of the user who creates and then updates all of a given model's records. I have the "user" information in the logged in user's UserProfile (all users must be logged in to update these records).

like image 782
MikeN Avatar asked Jan 05 '10 16:01

MikeN


3 Answers

It sounds like you're looking for django-reversion, which allows you to keep track of all changes to a given model, including some meta data about the change (e.g. who made it).

like image 161
Dominic Rodger Avatar answered Oct 02 '22 21:10

Dominic Rodger


Django models do not (on purpose) have access to the request object. You must pass it to the model in a view.

like image 27
Ignacio Vazquez-Abrams Avatar answered Oct 02 '22 21:10

Ignacio Vazquez-Abrams


The quickest way to set the user field automatically for all changes made in the admin, would be by overriding the save_model method in your admin class (from the Django docs):

class ArticleAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        obj.user = request.user
        obj.save()

Otherwise, you can use something like django-revision mentioned by Dominic Rodger.

like image 35
Will Hardy Avatar answered Oct 02 '22 22:10

Will Hardy