覆盖Django formset删除行为:如果Django模型formset中的空字段,则删除表单实例

时间:2013-06-25 17:50:26

标签: django formset

我经常遇到这个问题:

我想隐藏formset中的默认删除框,如果在每种形式的formset中清除某个字段,则删除对象的实例。

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

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

request上有一个名为BaseFormSet的方法,可以根据您自己的条件轻松自动删除实例,但这是一种“私有”方法,因此不确定将来的支持。您还需要通过调用_should_delete_form来保存表单集。

在下面的示例中,如果所有formset.save()值都评估为false值,它将删除一行。

fields