/ / Djangoフォームセットの削除動作をオーバーライド:Djangoモデルフォームセットの空のフィールドの場合、フォームインスタンスを削除-django、formset

Djangoのformsetの削除動作をオーバーライドする:Djangoモデルの空のフィールドを削除すると、フォームインスタンスが削除されるformset - django、formset

私はこれによく遭遇します:

フォームセットのデフォルトの削除ボックスを非表示にし、フォームセットの各フォームで特定のフィールドがクリアされている場合は、オブジェクトのインスタンスを削除します。

典型的な問題は、検証が邪魔になるか、これが空白のフォームの検出を中断し、フォームセットが保存されるときにすべてのフォーム(空白の余分なものも含む)の追加を開始することです。

回答:

回答№1は4

これが私が見つけた解決策です:

このコードはモデルフォームセットを作成し、空白のフィールドを許可することで検証し、保存時に削除するオブジェクトと保存するフォームを決定します。

TaskFormset = inlineformset_factory(User, FAQ, extra=3, can_delete=False, exclude=("user", "answer",))
formset = TaskFormset(request.POST, request.FILES, instance=user)
for form in formset:
form.fields["question"].required = False

// later when performing the formset save

for form in formset:
if form.instance.pk and form.cleaned_data["question"].strip() == "":
form.instance.delete()
elif form.cleaned_data:
form.save()

回答№2の場合は0

方法があります BaseFormSet と呼ばれる _should_delete_form これにより、独自の基準に基づいてインスタンスを自動的に削除することが簡単になりますが、これは「プライベート」メソッドであるため、将来のサポートについては不明です。また、フォームセットを保存して、 formset.save().

以下の例では、すべての fields 値は偽の値に評価されます。

class MyFormSet(forms.BaseInlineFormSet):
def _should_delete_form(self, form):
"""Return whether or not the form should be deleted."""
if form.cleaned_data.get(forms.formsets.DELETION_FIELD_NAME):
return True  # marked for delete
fields = ("name", "question", "amount", "measure", "comment")
if not any(form.cleaned_data[i] for i in fields):
return True
return False