ここではかなり基本的な使用シナリオです。オブジェクトを作成したユーザーと最後に変更したユーザーを保存したい。ただし、これはインライン モデルなので、もちろん使用する必要があります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
実際にフォームセットが 2 回保存されるとは考えずに、何よりも習慣から の呼び出しに取り組みました。それにもかかわらず、1 つを除くすべてのシナリオで機能します: 削除します。管理画面でインラインを削除しようとすると、すぐにエラーが発生します。エラーはかなりあいまいで、ここでの私の質問にはあまり関係ありませんが、フォームセット内のインスタンスの 1 つを削除した後にフォームセットを再度保存しようとしたことに関連していると思います。への呼び出しsuper
が削除されると、コードは正常に機能します。
長くても短くても、フォームセットの保存動作をカスタマイズし、サブクラスが独自のオーバーライドを実行できるようにする方法はありますか?