[英]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>
</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.