如何在Django admin中获取修改内联模型的用户id?

如何在Django admin中获取修改内联模型的用户id?,django,django-admin,Django,Django Admin,我有这些Django模型(brewity的最小数据): 我知道如何在AuthorAdmin中为书籍创建内联管理,但问题是,我需要保存AuditLog,其中包含关于谁添加了每个内联对象的信息 我知道我可以这样做,以便在保存作者时获得用户: # admin.py @admin.register(Author) class AuthorAdmin(admin.ModelAdmin): inlines = [BookInline] def save_model(self, reques

我有这些Django模型(brewity的最小数据):

我知道如何在AuthorAdmin中为书籍创建内联管理,但问题是,我需要保存AuditLog,其中包含关于谁添加了每个内联对象的信息

我知道我可以这样做,以便在保存作者时获得用户:

# admin.py
@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    inlines = [BookInline]

    def save_model(self, request, obj, form, change):
        AuditLog.objects.create(user=request.user, info={'blah': 'blahblah'})
        super().save_model(request, obj, form, change)

但是我应该怎么做来保存用户的信息,该用户使用内联表单集添加了一本新书(例如,一段时间后)
BaseInlineFormSet
方法不支持此操作。

ModelAdmin和InlineAdmin都源于BaseModelAdmin,因此您也可以向BookInline添加一个保存模型。

我成功地完成了我想要的操作,如下所示:

# forms.py
class BookInlineFormset(forms.BaseInlineFormset):
    def save_new(self, form, commit=True):
        if commit and hasattr(form, '_context'):
            context = form._context
            user = context['request'].user
            AuditLog.objects.create(user=user)
            # The Proper Way™ is probably to send a custom signal instead.
        return super().save_new(form, commit)


# admin.py
class BookInline(admin.TabularInline):
    formset = forms.BookInlineFormset
    model = Book # you know the drill 

@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    inlines = [BookInline]

    def save_model(self, request, obj, form, change):
        AuditLog.objects.create(user=request.user, info={'blah': 'blahblah'})
        super().save_model(request, obj, form, change)

    def save_formset(self, request, form, formset, change):
        context = {'request', request}
        form._context = context  # just in case
        for form in formset:
            form._context = context
        super().save_formset(request, form, formset, change)

不幸的是,
save\u model
是在
ModelAdmin
中定义的,而不是
BaseModelAdmin
因此
InlineAdmin
既不继承它也不继承使用它的逻辑。但是我刚刚意识到我可以在
AuthorAdmin
上重新定义
save\u formset
并开始在那里挖掘。你是对的,我刚刚阅读了源代码并滚动到fast,意识到save\u model只在ModelAdmin:-)中定义
# forms.py
class BookInlineFormset(forms.BaseInlineFormset):
    def save_new(self, form, commit=True):
        if commit and hasattr(form, '_context'):
            context = form._context
            user = context['request'].user
            AuditLog.objects.create(user=user)
            # The Proper Way™ is probably to send a custom signal instead.
        return super().save_new(form, commit)


# admin.py
class BookInline(admin.TabularInline):
    formset = forms.BookInlineFormset
    model = Book # you know the drill 

@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    inlines = [BookInline]

    def save_model(self, request, obj, form, change):
        AuditLog.objects.create(user=request.user, info={'blah': 'blahblah'})
        super().save_model(request, obj, form, change)

    def save_formset(self, request, form, formset, change):
        context = {'request', request}
        form._context = context  # just in case
        for form in formset:
            form._context = context
        super().save_formset(request, form, formset, change)