如何在Django admin中获取修改内联模型的用户id?
我有这些Django模型(brewity的最小数据): 我知道如何在AuthorAdmin中为书籍创建内联管理,但问题是,我需要保存AuditLog,其中包含关于谁添加了每个内联对象的信息 我知道我可以这样做,以便在保存作者时获得用户:如何在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
# 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)