vmassuchetto
vmassuchetto

Reputation: 1569

Django User Fields on Models

I would like every model of my app to store the user that created its entries. What I did:

class SomeModel(models.Model):
    # ...
    user = models.ForeignKey(User, editable = False)

class SomeModelAdmin(admin.ModelAdmin):
    # ...
    def save_model(self, request, obj, form, change):
        # Get user from request.user and fill the field if entry not existing

My question: As there's an entire app for User authentication and history, is there an easy way (perhaps, more oriented or standardized) of using any feature of this app instead of doing the above procedure to every model?

Update:

Here's what I did. It looks really ugly to me. Please let me know if there's a clever way of doing it.

I extended all the models i wanted to have these fieds on models.py:

class ManagerLog(models.Model):
    user = models.ForeignKey(User, editable = False)
    mod_date = models.DateTimeField(auto_now = True, editable = False, verbose_name = 'última modificação')
    class Meta:
        abstract = True

In admin.py, I did the same with the following class:

def manager_log_save_model(self, request, obj, form, change):
    obj.user = request.user
    return obj

Then, I also need to to override save_model on every extended model:

class ExtendedThing(ManagerLogAdmin):
    # ...
    def save_model(self, request, obj, form, change):
        obj = manager_log_save_model(self, request, obj, form, change)
        # ... other stuff I need to do here

Upvotes: 1

Views: 6668

Answers (2)

WeizhongTu
WeizhongTu

Reputation: 6424

more easy way,use save_model

class MyAdmin(admin.ModelAdmin):
    ...
    def save_model(self, request, obj, form, change):
        if getattr(obj, 'author', None) is None:
            obj.author = request.user
        obj.save()

see:https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model

Upvotes: 4

zsquare
zsquare

Reputation: 10146

I think you should check out the django packages section on versioning. All those apps will track changes to your model, who made those changes and when.

Upvotes: 2

Related Questions