我正在尝试在我的视图中设置表单验证,我希望得到您的帮助,因为我有一个小问题。
这是我的表单集:
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,那么表单必须先保存在表单集中。
如果我的表单集中的字段错误,就会出现问题。保存第一个表单后,它会创建一个仅包含第一个表单的对象,而不会使用我的表单集中的关联表单。
这是一个示例:
如您所见,它保存了我的第一个表单,但是直到所有表单集都有效后我才想要。
我必须在.save(commit=False)
和.save()
方法之间切换。
谢谢
答案 0 :(得分:0)
因此,不要先保存主表单。
if form.is_valid() and formsets.is_valid():
self.object = form.save()
formsets.instance = self.object
formsets.save()
(注意,您不需要单独保存表单集表单;只需将commit=False
都删除两次。)