我有一個視圖,用戶應該能夠更新模型的實例,並更新或創建與第一個模型相關的模型的新實例。我嘗試使用formset來做到這一點,它創建新對象perfeclty,但我沒有找到一種方式來顯示已經創建的對象。我的問題是,我不知道如何與現有的數據填充表單集,這樣我可以把它放在上下文使用db的信息填充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,並且正在使用它。現在,我可以使用現有數據填充表單,並且可以創建和更改現有數據,但是當我嘗試刪除它們時,沒有任何反應。
所以現在我定義這個表單集:
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}))
我可以在後(添加一些額外的線路),以檢查是否我必須刪除表單,但在視圖中對我來說不合適。有什麼我失蹤?
再次編輯:
最終找到這個link這正好解決我在這最後的問題,所以現在這一切都很好!
我不知道如何使用FBV將使在這種情況下,差異,因爲我的問題是如何用現有信息填充表單。但另一方面,你的鏈接幫助了我很多,現在我正在使用inlineformset_factory來完成它。現在我可以填充表單,創建新的實例並編輯已存在的實例,但是當我嘗試刪除它們時,它不會執行任何操作。對此有任何想法? – Thiago