5

我经常遇到这种情况:

如果在表单集的每个表单中清除了某个字段,我想隐藏表单集中的默认删除框并删除对象的实例。

典型的问题是,要么验证阻碍,要么这会破坏空白表单检测并在保存表单集时开始添加所有表单(甚至空白额外)。

4

2 回答 2

5

这是我找到的解决方案:

此代码创建一个模型表单集,通过允许空白字段确保它验证,然后在保存时确定要删除哪些对象以及要保存哪些表单。

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()
于 2013-06-25T17:50:26.210 回答
1

有一个方法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
于 2017-12-19T21:48:14.530 回答