カスタムフォームセット処理を提供しようとしています。ユーザーには、フォームを削除してフォームを追加するオプションがあります。同じ関数内で、関連するオブジェクトを削除して新しいオブジェクトを追加しようとしています。これは私が取り組んでいるコードの例です:
def addCategories(movie, category_formset):
if category_formset.deleted_forms:
for form in category_formset._get_deleted_forms:
obj_to_remove = form.save(commit=False)
movie.categories.remove(obj_to_remove)
for form in category_formset:
if form.cleaned_data.get('name') is not None:
obj = Category.objects.get_or_create_category(form.cleaned_data.get('name'))
movie.categories.add(obj)
movie.save()
問題は、._get_deleted_formsを正しく使用していないと思うことです。category_formset._get_deleted_formsは反復可能ではないと主張しています。そして、これがとにかく機能するかどうかはわかりません。削除されたオブジェクトが2番目のforループでモデルに追加される可能性があるためです。何か案は?
あまり効率的ではないように思われる回避策:
def addCategories(recipe, category_formset):
if category_formset.deleted_forms:
for form in category_formset:
if form in category_formset.deleted_forms:
obj_to_remove = form.save(commit=False)
recipe.categories.remove(obj_to_remove)
else:
if form.cleaned_data.get('name') is not None:
obj = Category.objects.get_or_create_category(form.cleaned_data.get('name'))
recipe.categories.add(obj)
else:
for form in category_formset:
if form.cleaned_data.get('name') is not None:
obj = Category.objects.get_or_create_category(form.cleaned_data.get('name'))
recipe.categories.add(obj)
recipe.save()