Django сохранение некоторых полей в БД, но не других - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь сохранить некоторые данные через форму и пытаюсь использовать FormSet. Данные, которые нужно сохранить, представляют собой счет-фактуру, которая содержит Product и Details.

. Мне удалось отобразить все в одном месте (это было непросто), а также сохранить счет-фактуру и детали в БД. По какой-то причине в таблице Detail сохраняется идентификатор продукта, но не идентификатор счета-фактуры. Это мое models.py:

class Detail(models.Model):
    invoice = models.ForeignKey(Invoice, null=True, on_delete=models.CASCADE)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    quantity = models.PositiveIntegerField(default=1)
    subtotal = models.DecimalField(max_digits=9 , null=True, decimal_places=2)

class Invoice(models.Model):
    date = models.DateField(default=datetime.date.today)
    number = models.CharField(max_length=10, default='0000000000')
    supplier = models.ForeignKey(Supplier, on_delete=models.CASCADE)
    products = models.ManyToManyField(Product, null=True, blank=True)
    total = models.DecimalField(max_digits=9 , null=True, decimal_places=2)

И это мое views.py:

def invoice_new(request):
    DetailFormSet = formset_factory(DetailForm, extra=2)
    if request.method == "POST":
        invoice_form = InvoiceForm(request.POST)
        detail_formset = DetailFormSet(request.POST)
        if invoice_form.is_valid() and detail_formset.is_valid():
            invoice = invoice_form.save(commit=False)
            invoice.save()
            for details in detail_formset:
                details.save()
            return redirect('invoice_detail', pk=invoice.pk)
        else:
            return redirect('invoice_error')
    else:
        invoice_form = InvoiceForm()
        detail_formset=formset_factory(DetailForm, extra=2)
        return render(request, 'invoice/invoice_edit.html', {'invoice_form': invoice_form, 'detail_form': detail_formset} )

Я пытался добавить это к телу for l oop:

details.invoice_id = invoice.pk

invoice.id печатает ОК, но не сохраняет номер в БД. Я не вижу, как он получает идентификатор продукта просто отлично, но не счета-фактуры.

Я добавляю forms.py

class InvoiceForm(forms.ModelForm):
    class Meta:
        model = Invoice
        fields = ['date','number','supplier']
        total = forms.DecimalField(disabled=True)

class DetailForm(forms.ModelForm):
    class Meta:
        model = Detail
        fields = ['product','quantity']

1 Ответ

0 голосов
/ 21 февраля 2020

Вы можете установить идентификатор счета-фактуры перед сохранением формы.

    if invoice_form.is_valid() and detail_formset.is_valid():
        invoice = invoice_form.save(commit=False)
        invoice.save()
        for details in detail_formset:
            details.invoice = invoice # Set the invoice
            details.save()
...