Django 如何在ModelAdmin中为save in models和save_model创建动态方法以获取和设置当前用户。

Django 如何在ModelAdmin中为save in models和save_model创建动态方法以获取和设置当前用户。,django,django-models,Django,Django Models,如何在模型中保存当前用户,而不为每个模型创建一个方法?有一种动态的方法来实现所有范围的功能吗?有些人喜欢这样: 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 = mod

如何在模型中保存当前用户,而不为每个模型创建一个方法?有一种动态的方法来实现所有范围的功能吗?有些人喜欢这样:

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
我将新模型扩展到BaseTable

我的问题:每次我都需要覆盖所有模型中的save方法:客户机、发票、签出以在ModelAdmin中设置当前用户,还是有其他方法来简化此过程

我正在使用:

管理员

这很有效。但是如果a有20个模型呢?我需要逐个覆盖所有保存模型方法吗?没有比这更动态的了吗?

解决问题:

一段时间后,我找到了一个解决方案:

1-在调用之前在admin.py中创建一个Mixin

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-在您的模型上调用它作为继承,例如:

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

这将在调用时覆盖save_model方法。

您当然可以使用一个定义该方法的共享类,您的所有modeladmin类都继承或混合该方法。请给我一个示例
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)
@admin.register(Clients)
class ClientsAdmin(SetUserAdminMixin, admin.ModelAdmin):
    model = Clients