ここではかなり基本的な使用例があります。オブジェクトを作成したユーザーと最後に変更したユーザーを保存します。しかし、インラインモデルなので、もちろんsave_formset
を使用する必要があります。 Djangoのドキュメントは、以下の例のコードを持っている:あなたが気づいた場合ModelAdminでsave_formsetをさらにオーバーライドできるようにする
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つを削除した後にformsetを再度保存しようとするのと関連していると思います。コードはsuper
への呼び出しが削除されたときに正常に機能します。
長すぎると短く、フォームセットの保存動作をカスタマイズする方法がありませんとサブクラスで独自のオーバーライドを実行できますか?
でDjangoの1.10を使用して、また削除の問題の世話をするように見えるコード、であるだけで[未解決チケット](https://code.djangoproject.com/ましたチケット/ 17988) – okm