使用Django验证表单和表单集

时间:2018-11-27 10:05:48

标签: python django django-forms formset

我正在尝试在我的视图中设置表单验证,我希望得到您的帮助,因为我有一个小问题。

这是我的表单集:

DocumentFormSet = inlineformset_factory(Publication, Document, form=DocumentForm, extra=1, max_num=4, can_delete=True)

这是我的代码:

def get_context_data(self, **kwargs):
    context = super(PublicationCreateView, self).get_context_data(**kwargs)
    document_queryset = Document.objects.all()
    context['FormSets'] = DocumentFormSet(self.request.POST or None, self.request.FILES or None,
                                                  prefix='doc', queryset=document_queryset)
    return context

def form_valid(self, form):
    try:
        context = self.get_context_data()
        formsets = context['FormSets']
        if form.is_valid():
            self.object = form.save(commit=False)
            if formsets.is_valid():
                formsets.instance = self.object
                formsets.save(commit=False)
                for element in formsets:
                    element.save(commit=False)
            self.object = form.save()
            formsets.save()
        return super(PublicationCreateView, self).form_valid(form)
     except IntegrityError:
         ...

我读了一些东西,特别是如果我的表单集中的表单和表单之间存在ForeignKey,那么表单必须先保存在表单集中。

如果我的表单集中的字段错误,就会出现问题。保存第一个表单后,它会创建一个仅包含第一个表单的对象,而不会使用我的表单集中的关联表单。

这是一个示例:

enter image description here

如您所见,它保存了我的第一个表单,但是直到所有表单集都有效后我才想要。

我必须在.save(commit=False).save()方法之间切换。

谢谢

1 个答案:

答案 0 :(得分:0)

因此,不要先保存主表单。

if form.is_valid() and formsets.is_valid():
    self.object = form.save()
    formsets.instance = self.object
    formsets.save()

(注意,您不需要单独保存表单集表单;只需将commit=False都删除两次。)