Ricardo Prado
Ricardo Prado

Reputation: 136

How to create dynamic method for save in models and save_model in ModelAdmin to get and set current user.

how I save the current user in Models without create one method per model? There's a dynamic way to implement this for all scope? Some like this:

class BaseTable(models.Model):
    created_at = models.DateTimeField(auto_now_add=True, editable=False)
    modified_at = models.DateTimeField(auto_now=True, editable=False)
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, related_name='%(class)s_createdby', editable=False)
    modified_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT ,related_name='%(class)s_modifiedby', editable=False)

    class Meta:
        abstract = True

And I extend the new model to BaseTable

class Clients(BaseTable):
    first_name = models.CharField(max_length=50,verbose_name='Nome')
    last_name = models.CharField(max_length=50, verbose_name='Sobrenome')

My question: everytime I'll need overwrite the save() method in all models: Clients, Invoices, Checkout to set the current user in ModelAdmin or there other way to simplify this proccess?

I'm using:

admin.py

@admin.register(Clients)
class ClientsAdmin(admin.ModelAdmin):
    model = Clients

    def save_model(self, request, obj, form, change):
        obj.created_by = request.user
        obj.modified_by = request.user
        super().save_model(request, obj, form, change)

It's works. But If a had 20 models? I need overwrite one by one all save_model method? Nothing more dynamic?

Upvotes: 0

Views: 205

Answers (1)

Ricardo Prado
Ricardo Prado

Reputation: 136

Resolution question:

after some time, I found a solution:

1 - Create a Mixin in admin.py before the call it

class SetUserAdminMixin(object):
    def save_model(self, request, obj, form, change):
        obj.created_by_id = request.user.id
        obj.modified_by_id = request.user.id
        super(SetUserAdminMixin, self).save_model(request, obj, form, change)

2 - Call it on you model as inherit, example:

@admin.register(Clients)
class ClientsAdmin(SetUserAdminMixin, admin.ModelAdmin):
    model = Clients

And this overwrite the save_model() method when called.

Upvotes: 1

Related Questions