这里非常基本的使用场景。我想保存创建对象的用户和最后修改它的用户。但是,它是一个内联模型,所以我当然需要使用save_formset
. Django 文档有以下示例代码:
class ArticleAdmin(admin.ModelAdmin):
def save_formset(self, request, form, formset, change):
instances = formset.save(commit=False)
for instance in instances:
instance.user = request.user
instance.save()
formset.save_m2m()
问题是,如果你注意到,因为super
从来没有被调用,这是一个死胡同。如果ModelAdmin
是子类并且此方法以相同的方式被覆盖,您将失去父级中固有的功能。这很重要,因为这是一个常见的使用场景,我想将功能分解出来,所以我创建了以下内容:
class TrackableInlineAdminMixin(admin.ModelAdmin):
def save_formset(self, request, form, formset, change):
instances = formset.save(commit=False)
for instance in instances:
if hasattr(instance, 'created_by') and hasattr(instance, 'modified_by'):
if not instance.pk:
instance.created_by = request.user
instance.modified_by = request.user
instance.save()
formset.save_m2m()
super(TrackableInlineAdminMixin, self).save_formset(request, form, formset, change)
super
出于习惯,我比其他任何事情都更倾向于呼吁,没想到它实际上会导致表单集保存两次。尽管如此,它仍然适用于所有场景,除了一个:删除。一旦您尝试在管理员中删除内联,您就会收到错误消息。该错误非常模糊,与我在这里的问题并不真正相关,但我相信它与您刚刚删除其中一个实例后尝试再次保存表单集有关。当调用super
被删除时,代码工作得很好。
总而言之,我是否缺少任何方法来自定义表单集保存行为并允许子类进行自己的覆盖?