我有一个视图,用户应该能够更新模型的实例,还可以更新或创建与第一个模型相关的模型的新实例。我尝试使用表单集来执行此操作,它非常适合创建新对象,但我没有找到一种方法来显示已经创建的对象。我的问题是我不知道如何用现有数据填充表单集,以便我可以将它放在上下文中
所以这是我的模型:
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,并且正在使用它。现在我可以用现有数据填充表单集,并且可以创建和更改现有数据,但是当我尝试删除它们时,什么也没有发生。
所以现在我正在定义这个表单集:
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() 中添加一些额外的行来检查我是否必须删除表单,但在视图中执行它似乎不适合我。还有什么我想念的吗?
再次编辑:
最终找到了这个链接,它完全解决了我遇到的最后一个问题,所以现在一切都很好!