10

私は Django 管理者を使用しており、InlineModelAdminオブジェクトとしてマップされている関連オブジェクトに変更を加えようとしています。Django が提供するsave_related(self, request, form, formets, change)メソッドを使用してこれを実行しようとしています。何かを保存しようとすると、エラーが発生します。

AttributeError: 'AlumniResponseFormFormSet' object has no attribute 'new_objects'

他の情報:

1) InlineModelAdmin が 2 つあります
。2) このエラーが発生したときに、AlumniResponseInline を保存していません。同じ親モデルに関連付けられた別の InlineModelAdmin を保存しています
3) save_related() メソッドを追加するまで、どちらの InlineModelAdmin も保存に問題はありませんでした
4) このエラーは、すべてコードが save_related() で実行された後に発生しているため、その例外のキャッチを制御することはできません

save_related()に関するドキュメントから:

save_related メソッドには、HttpRequest、親 ModelForm インスタンス、インライン フォームセットのリスト、および親が追加または変更されているかどうかに基づくブール値が与えられます。ここで、親に関連するオブジェクトの保存前または保存後の操作を実行できます。この時点で、親オブジェクトとそのフォームは既に保存されていることに注意してください。

4

1 に答える 1

7

私はsave_relatedの代わりにsave_formsetを使用していますが、メソッド内の2つの重要な行を見逃していることに気付くまで、同じ問題を抱えていました:

instances = formset.save(commit=False)

最初に、そしてループ インスタンスの後に、各インスタンスで何かを行います。

instance.save() #commit instance changes
formset.save_m2m() #commit the whole formset changes

最後に。

戻る前に save_m2m() メソッドを呼び出さない場合、formset オブジェクトにはconstruct_change_message(self, request, form, formsets)、contrib/admin/options.py のメソッドで必要な 'new_objects' 属性がありません。

したがって、これは、何かを作成するかどうかに関係なく、メイン モデルにあるすべてのインラインに対して実行する必要があります。

于 2014-05-08T09:37:09.287 に答える