【问题标题】:Populate formset with information from db使用来自 db 的信息填充表单集
【发布时间】:2013-09-10 22:12:06
【问题描述】:

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

这是我的模型:

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

再次编辑:

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

【问题讨论】:

    标签: python django formset


    【解决方案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

    【讨论】:

    • 我看不出在这种情况下使用 FBV 会有什么不同,因为我的问题是如何用现有信息填充表单集。但另一方面,您的链接对我帮助很大,现在我正在使用 inlineformset_factory 来做这件事。现在我可以填写表单集,创建新实例并编辑已经存在的实例,但是当我尝试删除它们时,它什么也没做......对此有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多