【发布时间】:2021-06-11 02:46:55
【问题描述】:
我正在处理具有三种形式的发票,其中一种具有多个实例。前两个表单每个都有一个实例,最后一个可以容纳用户想要的任意数量。这意味着用户将使用 JavaScript 添加最后一个表单的实例。使用下面的代码,我收到一个错误,说前两个表单的字段缺少数据,因为每当用户向最后一个表单添加额外的字段时,Django 认为我也在向其他两个表单添加额外的表单。请帮忙
这是一个 POST 数据示例,最后一个表单有两个额外字段:
form-TOTAL_FORMS '2'
form-INITIAL_FORMS '0'
form-MIN_NUM_FORMS '0'
form-MAX_NUM_FORMS '1000'
form-0-number '215'
form-0-customer '4'
form-0-sales_person '1'
form-0-product '2'
form-0-quantity '20'
form-0-price '20'
form-1-product '2'
form-1-quantity '40'
form-1-price '50'
这是我的观点.py
def createInvoice(request):
invoiceFormSet = formset_factory(InvoiceForm)
retailPriceFormSet = formset_factory(RetailPriceForm, extra=2)
saleItemFormSet = formset_factory(SaleItemForm)
if request.method == 'POST':
invoiceform = invoiceFormSet(request.POST or None)
retailPriceform = retailPriceFormSet(request.POST or None)
saleItemform = saleItemFormSet(request.POST or None)
if invoiceform.is_valid() and saleItemform.is_valid():
for si in saleItemform:
saleItem = si.save()
saleItem_id = get_object_or_404(SaleItem, id=saleItem.id)
for i in invoiceform:
inv = i.save(commit=False)
inv.sale_item = saleItem_id
inv.save()
for rp in retailPriceform:
retailPrice = rp.save(commit=False)
retailPrice.sale_item = saleItem_id
retailPrice.save()
return HttpResponse(retailPriceform.cleaned_data)
context = {'invoiceFormSet':invoiceFormSet,'retailPriceFormSet':retailPriceFormSet, 'saleItemFormSet':saleItemFormSet}
return render(request, 'createInvoice.html',context)
这是我的模板
{% extends 'base.html' %}
{% block title %} Create Invoice {% endblock %}
{% block content %}
<form method="post">
{% csrf_token %}
{{saleItemFormSet.as_p}}
{{invoiceFormSet.as_p}}
{{ retailPriceFormSet.management_form }}
{% for form in retailPriceFormSet %}
<div>{{form.as_p}}</div>
{% endfor %}
<button type="submit" class="btn btn-normal btn-main">Save</button>
</form>
{% endblock %}
【问题讨论】:
标签: python django django-views django-forms django-templates