Reputation: 136
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
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