【问题标题】:Handling three forms on the same page with one having multiple instances - Django在同一页面上处理三个表单,其中一个具有多个实例 - Django
【发布时间】: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


    【解决方案1】:

    使用前缀在单个视图中使用多个表单集。 示例:

    如果得到:,

    article_formset = invoiceFormSet(prefix='articles')
    book_formset = retailPriceFormSet(prefix='books')
    

    如果发布:

    article_formset = invoiceFormSet(request.POST, request.FILES, prefix='articles')
    book_formset = retailPriceFormSet(request.POST, request.FILES, prefix='books')
    
    

    参考:Django Documentation

    【讨论】:

    • 不客气。我认为您可以将此答案标记为已接受。
    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    相关资源
    最近更新 更多