我在查看了一些预先制作的类视图后,添加了自己的版本。 我特别需要在单个视图中对多个表单集合 -> 一个父级
进行控制,每个表单集合都有独立的保存功能。
我基本上将FormSet数据绑定到get_named_formsets
函数中,该函数由get_context_data
和form_valid
调用。
在这里,我检查所有表单集是否有效,并查找覆盖普通的formset.save()
的方法,以便在每个表单集上进行自定义保存。
模板通过渲染表单集合来呈现。
{% with named_formsets.my_specific_formset as formset %}
{{ formset }}
{{ formset.management_form }}
{% endwith %}
我认为我将经常使用这个系统。
class MyView(UpdateView):
def get_context_data(self, **kwargs):
ctx = super(MyView, self).get_context_data(**kwargs)
ctx['named_formsets'] = self.get_named_formsets()
return ctx
def get_named_formsets(self):
return {
'followup': FollowUpFormSet(self.request.POST or None, prefix='followup'),
'action': ActionFormSet(self.request.POST or None, prefix='action'),
}
def form_valid(self, form):
named_formsets = self.get_named_formsets()
if not all((x.is_valid() for x in named_formsets.values())):
return self.render_to_response(self.get_context_data(form=form))
self.object = form.save()
for name, formset in named_formsets.items():
formset_save_func = getattr(self, 'formset_{0}_valid'.format(name), None)
if formset_save_func is not None:
formset_save_func(formset)
else:
formset.save()
return http.HttpResponseRedirect('')
def formset_followup_valid(self, formset):
"""
Hook for custom formset saving.. useful if you have multiple formsets
"""
followups = formset.save(commit=False)
for followup in followups:
followup.who = self.request.user
followup.contact = self.object
followup.save()
self.object
,而不是self.instance
。 - orokusakiself.object
而不是self.instance
是正确的。 - edhedgesget_context_data()
中检查请求方法好像没有太多意义。根据Django源代码中的ProcessFormView
,你应该在get()
和post()
方法中实例化表单并将它们添加到get_context_data(form=form)
中。 - Soviutself.get_context_data(form=form)
),会重新创建表单集。这并不是问题,直到您的表单集中出现非表单错误,这些错误会在调用formset.is_valid()
(访问formset.errors
导致实例化错误列表)时出现。解决方法是重用表单集(将其传递给get_context_data
并在get_context_data
中检查是否提供了它,只有在没有提供时才添加它...或者像之前的评论建议的那样使用post
,自然而然地导致重复使用表单集)。 - orokusaki