0

我有一个视图,用户应该能够更新模型的实例,还可以更新或创建与第一个模型相关的模型的新实例。我尝试使用表单集来执行此操作,它非常适合创建新对象,但我没有找到一种方法来显示已经创建的对象。我的问题是我不知道如何用现有数据填充表单集,以便我可以将它放在上下文中

所以这是我的模型:

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() 中添加一些额外的行来检查我是否必须删除表单,但在视图中执行它似乎不适合我。还有什么我想念的吗?

再次编辑:

最终找到了这个链接,它完全解决了我遇到的最后一个问题,所以现在一切都很好!

4

1 回答 1

1

我认为最好为此使用基于普通功能的视图(FBV)。首先了解正在发生的事情,然后如果确实需要,然后逐渐转向 CBV。

这将帮助您处理 FBV:

http://catherinetenajeros.blogspot.com/2013/03/inline-formset-saving-and-updating-two.html

这可能对您的 CBV 有所帮助:

具有内联模型表单或表单集的基于 django 类的视图

于 2013-09-10T22:48:36.777 回答