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