Django:如何使用自定义模型表单保存表单集?

时间:2011-07-21 15:54:04

标签: django django-forms

尝试使用自定义表单保存一堆对象:

class CustomForm(forms.ModelForm):
    class Meta:
        model = Widget
    complexify = models.BooleanField()

当选中complexify时,我需要对widget对象进行一些复杂的操作。

我做不到:

for object in formset.save(commit=False):
    ...

因为它没有complexify标志。

通过每种形式似乎是错误的方式:

for form in formset.forms:
    ...

因为它包含额外(空)表单和删除的表单。

关于如何完成这项工作的任何想法?

2 个答案:

答案 0 :(得分:1)

我可以找到这个问题的最佳答案是覆盖表单上的save

class CustomForm(forms.ModelForm):
    class Meta:
        model = Widget
    complexify = models.BooleanField()

    def save(self, *args, **kwargs):
        obj = super(CustomForm, self).save(*args, **kwargs)
        obj.complexify = self.cleaned_data.get("complexify")
        return obj

然后当你处理它们时它就可以使用了:

for object in formset.save(commit=False):
    if object.complexify: 
        object.do_complicated()

答案 1 :(得分:0)

我遇到了类似的问题,需要在保存之前更新表单中的字段。我的解决方案是执行上面建议的操作,但是然后跳过使用has_changed方法未更改的表单,如下所示:

for form in formset.forms:
    object = form.save(commit=False)

    if form.has_changed():
        #make additions to object here
        object.save()

我从未使用过complexify标志,但你的问题似乎与我自己的问题有关,所以我想我会传递信息。当然,如果有人看到任何会导致这种方法出现问题的东西,请告诉我,我仍然是Django的初学者。