使用db中的信息填充formset

时间:2013-09-10 22:12:06

标签: python django formset

我有一个视图,用户应该能够更新模型的实例,还可以更新或创建与第一个模型相关的模型的新实例。我尝试使用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来解决我遇到的最后一个问题,所以现在一切都很好!

1 个答案:

答案 0 :(得分:1)

我认为最好使用基于正常功能的视图(FBV)。首先了解发生了什么,然后逐渐转向CBV,如果你真的需要的话。

这将帮助您了解FBV:

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

这可以帮助您使用CBV:

django class-based views with inline model-form or formset