2013-09-10 2 views
0

사용자가 모델 인스턴스를 업데이트 할 수 있어야하며 첫 번째 인스턴스와 관련된 모델의 새 인스턴스를 업데이트하거나 만들 수 있어야합니다. 나는 formes를 사용하여이를 수행하고, 새로운 객체를 생성하는 데는 완벽하게 작동하지만, 이미 생성 된 객체를 표시하는 방법을 찾지는 못한다.db의 정보로 formset 채우기

class Order(Model): 
... 

class invoice(Model): 
    order = models.ForeignKey(Order) 
... 

그리고 내보기는 무언가이다 : 내 문제는 내가

그래서이 내 모델입니다 컨텍스트에 넣을 수 있도록 내가, 기존 데이터로 formsets을 채우는 방법을 모르겠입니다 이 같은 :

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에 대해 배웠고 사용하고 있습니다. 이제 기존 데이터로 formsets을 채울 수 있으며 기존 데이터를 만들고 변경할 수 있지만 삭제하려고하면 아무 일도 일어나지 않습니다.

그래서 지금은이의 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})) 

내가 포스트 (일부 여분의 라인을 추가 할 수 있습니다 내가 양식을 삭제해야하지만보기에 그것을 수행하는 것이 옳지 않은 것 같습니다. 내가 놓친 다른 것이 있습니까? 다시

편집 :

그래서 지금은 모두 좋은, 정확히 내가 가진 한이 마지막 문제를 해결이 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를 사용하여 표시되지 않습니다 , 내 문제는 기존 정보로 formsets을 채우는 방법에 관한 것이기 때문에. 그러나 다른 한편으로는, 당신의 링크가 나를 아주 많이 도왔고, 이제는 그것을하기 위해 inlineformset_factory를 사용하고 있습니다. 이제 formets을 채우고 새 인스턴스를 만들고 이미 존재하는 인스턴스를 편집 할 수 있지만 삭제하려고하면 아무 것도하지 않습니다. – Thiago