2013-09-10 69 views
0

我有一個視圖,用戶應該能夠更新模型的實例,並更新或創建與第一個模型相關的模型的新實例。我嘗試使用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這正好解決我在這最後的問題,所以現在這一切都很好!

回答

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

+0

我不知道如何使用FBV將使在這種情況下,差異,因爲我的問題是如何用現有信息填充表單。但另一方面,你的鏈接幫助了我很多,現在我正在使用inlineformset_factory來完成它。現在我可以填充表單,創建新的實例並編輯已存在的實例,但是當我嘗試刪除它們時,它不會執行任何操作。對此有任何想法? – Thiago