2013-09-10 2 views
0

У меня есть представление, где пользователь должен иметь возможность обновлять экземпляр модели, а также обновлять или создавать новые экземпляры модели, связанной с первой. Я попытался использовать formsets для этого, и он отлично работает для создания новых объектов, но я не нахожу способ показать уже созданные объекты. Моя проблема заключается в том, что я не знаю, как заполнить FormSets с существующими данными, так что я могу поставить его в контекстеЗаполните набор форм с информацией из db

Так что это мои модели:

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 

Там, наверное, простой способ сделать это, но я не нахожу его в любом месте

EDIT: Благодаря @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})) 

Я мог бы добавить несколько дополнительных строк в посте(), чтобы проверить, если я нужно удалить форму, но мне кажется не правильным делать это в представлении. Есть ли что-то еще, что мне не хватает?

EDIT СНОВА:

Законченное найти эту link который исправить именно эту последнюю проблему у меня был, так что теперь все хорошо!

ответ

1

Я думаю, что для этого лучше использовать обычные функции (FBV). Поймите, что происходит сначала, а затем постепенно перейдите в CBV, если вам действительно нужно.

Это поможет вам с FBV:

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

Это может помочь вам с ОЦК:

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

+0

Я не вижу, как с помощью FBV бы сделать разницу в этом случае , поскольку моя проблема заключалась в том, как заполнять формы с помощью существующей информации. Но, с другой стороны, ваши ссылки очень помогли мне, и теперь я использую inlineformset_factory для этого. Теперь я могу заполнить формы, создать новые экземпляры и отредактировать те, которые уже существуют, но когда я пытаюсь их удалить, он ничего не делает .. Любые мысли об этом? – Thiago

Смежные вопросы