带有can_delete = True和can_order = True的Django inline_formset不起作用

时间:2013-09-11 20:41:26

标签: django django-forms inline-formset

我有一个表单,模型和外键模式表示为内联表单集。 我有一个节省订购的formsets的helluva时间。事实上,每当我尝试删除一个时,它就会成倍增加。

form.py中的

class PublicationForm(ModelForm):
    class Meta:
        model = Publication
        fields = ['title']

SectionFormSet = inlineformset_factory(Publication, Section, can_delete=True, can_order=True, extra=2)

并在views.py中:

if publication_form.is_valid():
    pub = publication_form.save(commit=False)
    section_formset = SectionFormSet(request.POST, instance=pub, prefix='section')
    if section_formset.is_valid():
        pub.save()
        for s in section_formset.ordered_forms:
            s.instance.order = s.cleaned_data['ORDER']
            s.save()

我对S.O.但一无所获。 有人有解决方案吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

是的,你所有的保存都混乱了。像这样:

1 - 您的formset包含SectionForm的集合,因此您正在测试表单在错误的循环中是否有效。你想要这个:

if request.method == 'POST':
    section_formset = SectionFormSet(request.POST, instance=<an instance of Publication>, prefix='section')
    if section_formset.is_valid():
        instances = section_formset.save(commit=False)
        for instance in instances:
             #do something
             instance.save()
        return HttpResponseRedirect('<a url>')
else:
    section_formset = SectionFormSet(instance=<an instance of Publication>, prefix='section')

如果您只是将剖面形式的“order”值保存到剖面模型命令attr中,则不需要执行实例循环 - 它已经为您完成了。你可以调用section_formset.save()。

相关问题