javascript - 如何通过在 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
但您invoice
在 nextif formset.is_valid():
中使用时也运行 if form.is_valid():
is False
。
您应该在if formset.is_valid():
内部运行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('/')
推荐阅读
- laravel - Laravel 模型控制器依赖注入
- sql - 列出特定查询的至少有一行具有非空值的表的列
- javascript - 在 node.js 中为链式函数编写笑话测试
- android - 在后台服务中拦截 Android 蓝牙相机快门
- python - Python:如何在 kivy 中使标签加粗
- javascript - 将当前日期与从 api 响应收到的日期进行比较
- powershell - Powershell cmdlet New-AzureRmSqlDatabaseExport 中的共享访问签名 (SAS) 密钥有什么格式?
- php - 数组到对象抛出未捕获的错误:调用未定义的方法 stdClass
- excel - 将 16 名玩家分成 4 组,其中没有人来自同一个较早的组
- javascript - toplevel var statement with common vs. assignment statement with comma: why are they different