我有一个视图,用户应该能够更新模型的实例,还可以更新或创建与第一个模型相关的模型的新实例。我尝试使用formset来完成这项工作,并且它可以完美地创建新对象,但我找不到一种方法来显示已经创建的对象。我的问题是我不知道如何使用现有数据填充表单集,以便我可以将它放在上下文中
所以这是我的模特:
class Order(Model):
...
class invoice(Model):
order = models.ForeignKey(Order)
...
我的观点是这样的:
class OrderDetailView(UpdateView):
invoice_form_class = InvoiceForm
def get_context_data(self, **kwargs):
context = super(OrderDetailView, self).get_context_data(**kwargs)
if not 'invoice_formset' in context:
context['invoice_formset'] = formset_factory(self.invoice_form_class, extra=3, can_delete=True, formset=BaseFormSet)
return context
这可能是一种简单的方法,但我无法在任何地方找到它
修改 感谢@mariodev,我已经了解了inline_formsetfactory,我正在使用它。现在我可以使用现有数据填充表单集,并且我可以创建和更改现有数据,但是当我尝试删除它们时,没有任何反应。
所以现在我正在定义这个formset:
InvoiceFormset = inlineformset_factory(Order, Invoice, fields=('code',), can_delete=True, extra=0)
我的观点如下:
class OrderDetailView(UpdateView):
invoice_form_class = InvoiceForm
def get_context_data(self, **kwargs):
context = super(OrderDetailView, self).get_context_data(**kwargs)
if not 'invoice_formset' in context:
context['invoice_formset'] = InvoiceFormset(instance=self.get_object())
return context
def post(self, *args, **kwargs):
data = self.request.POST
order = self.get_object()
form = self.form_class(data)
invoice_formset = InvoiceFormset(data, instance=order)
if form.is_valid() and invoice_formset.is_valid():
self.object = form.save(order)
for f in invoice_formset:
f.save(self.object)
return HttpResponseRedirect(reverse('order_detail', kwargs={'order_id': self.get_object().order_id}))
我可以在post()中添加一些额外的行来检查我是否必须删除表单,但是我在视图中执行它似乎不对。还有其他我想念的东西吗?
再次编辑:
结束找到这个link来解决我遇到的最后一个问题,所以现在一切都很好!
答案 0 :(得分:1)
我认为最好使用基于正常功能的视图(FBV)。首先了解发生了什么,然后逐渐转向CBV,如果你真的需要的话。
这将帮助您了解FBV:
http://catherinetenajeros.blogspot.com/2013/03/inline-formset-saving-and-updating-two.html
这可以帮助您使用CBV: