簡體   English   中英

如何通過在 django 中使主表單外鍵達到峰值來保存發票表單集?

[英]How to save invoice formset by peaking main form foreign key in django?

請幫助我是 Django 的初學者,我想將我的發票保存在數據庫中,我面臨的問題是當我想保存表單集時,我無法從主表單中獲取外鍵峰值

查看.py

def createInvoice(request):`
    if request.method == 'GET':`
        formset = LineItemForm(request.POST or None)`
        form = InvoiceForm(request.GET or None)
    if request.method == 'POST':
        formset = LineItemForm(request.POST)
        form = InvoiceForm(request.POST)
        if form.is_valid():
            invoice = Invoice.objects.create(customer = form.data["customer"],
                    customer_email = form.data["customer_email"],
                    message = form.data["message"],
                    date = form.data["date"],
                    due_date = form.data["due_date"],
                    )
        if formset.is_valid():
            for form in formset:
                service = form.cleaned_data.get('service')
                description = form.cleaned_data.get('description')
                quantity = form.cleaned_data.get('quantity')
                rate = form.cleaned_data.get('rate')
                    LineItem(customer=invoice,
                            service=service,
                            description=description,
                            quantity=quantity,
                            rate=rate,
                            amount=amount).save()
            invoice.save()
            return redirect('/')
    context = {"title" : "Invoice Generator","formset":formset, "form": form}
    return render(request, 'home/invoice.html', context)

這是我的 Model.py

class Invoice(models.Model):
    customer = models.CharField(max_length=100)
    customer_email = models.EmailField(null=True, blank=True)
    message = models.TextField(default= "this is a default message.")
    date = models.DateField()
    due_date = models.DateField()
    def __str__(self):
        return str(self.customer)

class LineItem(models.Model):
    customer = models.ForeignKey(Invoice, on_delete=models.CASCADE)
    service = models.TextField(max_length=100)
    description = models.TextField(max_length=100)
    quantity = models.IntegerField(max_length=10)
    rate = models.DecimalField(max_digits=9, decimal_places=2)
    amount = models.DecimalField(max_digits=9, decimal_places=2)
    def __str__(self):
        return str(self.customer)

這是我的發票創建模板,沒有主表格。 主窗體沒有任何問題

invoce.html

    <table class="table is-fullwidth is-bordered is-hoverable is-striped" id="table_field">
                        <thead>
                            <tr>
                                <th>Product/Service</th>
                                <th>Description</th>
                                <th>QTY</th>
                                <th>RATE</th>
                                <th>AMOUNT</th>
                                <th>ADD</th>
                                <th>REMOVE</th>
                            </tr>
                        </thead>
                        <tbody class="form-row">
                            <!--<input type="hidden" name="form-TOTAL_FORMS" value="1" id="id_form-TOTAL_FORMS"><input type="hidden" name="form-INITIAL_FORMS" value="0" id="id_form-INITIAL_FORMS"><input type="hidden" name="form-MIN_NUM_FORMS" value="0" id="id_form-MIN_NUM_FORMS"><input type="hidden" name="form-MAX_NUM_FORMS" value="1000" id="id_form-MAX_NUM_FORMS">                    
                        -->      
                            <tr>
                                <td>{{formset.service}}</td>
                                <td>{{formset.description}}</td>
                                <td>{{formset.quantity}}</td>
                                <td>{{formset.rate}}</td>
                                <td>{{formset.amount}}</td>
                                <td><div class="input-group-append">
                                        <button name="add" class="button is-small btn btn-success add-form-row" id="add" value="Add">+</button>&nbsp; 
                                    </div>
                                </td>
                                <td>
                                    <div class="input-group-append">
                                        <button name="remove" class="button is-small btn btn-danger remove-form-row" id="remove" value="Remove">-</button>
                                    </div>
                                </td>
                            </tr>                            
                        </tbody>        
                    </table>

當我嘗試保存時出現此錯誤

Traceback (most recent call last):
  File "C:\Users\xxxxxxx\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\xxxxxxx\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "D:\DS\Accounts\MyApp\views.py", line 136, in createInvoice
    invoice.save()
UnboundLocalError: local variable 'invoice' referenced before assignment

我無法測試它,但我認為您需要不同的意圖。

invoice僅在if form.is_valid():給出True時創建,但您在下一個if formset.is_valid():使用invoice ,這也在if form.is_valid():False

您應該運行if formset.is_valid(): inside if form.is_valid():僅在創建invoice時使用

    if form.is_valid():
        invoice = Invoice.objects.create(customer = form.data["customer"],
                    customer_email = form.data["customer_email"],
                    message = form.data["message"],
                    date = form.data["date"],
                    due_date = form.data["due_date"],
                    )
        if formset.is_valid():
            for form in formset:
                service = form.cleaned_data.get('service')
                description = form.cleaned_data.get('description')
                quantity = form.cleaned_data.get('quantity')
                rate = form.cleaned_data.get('rate')
                LineItem(customer=invoice,
                         service=service,
                         description=description,
                         quantity=quantity,
                         rate=rate,
                         amount=amount).save()
            invoice.save()
            return redirect('/')

@furas 感謝您的回復,當我嘗試像您一樣格式化時什么也沒發生,但是根據您的解釋,我嘗試更改我的表單集,但仍然無法正常工作

        if formset.is_valid():
            for form in formset:
                service = form.cleaned_data.get('service')
                description = form.cleaned_data.get('description')
                quantity = form.cleaned_data.get('quantity')
                rate = form.cleaned_data.get('rate')
                amount = form.cleaned_data.get('amount')
                LineItem(customer=invoice,
                            service=service,
                            description=description,
                            quantity=quantity,
                            rate=rate,
                            amount=amount).save()
            invoice.save()

但仍然無法正常工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM