Django formset没有得到保存

时间:2016-05-16 19:17:04

标签: django django-models django-forms django-templates

我有一个formset,我正在尝试将其保存回来。但是,当我尝试检查formset.is_valid()并保存时,即使formset中没有任何内容被更改,验证也总是失败。我正在使用formset显示已存在的数据并尝试编辑它。我不知道我哪里出错了。有人可以帮忙吗? :(

views.py

def product(request, product_id):
    product = get_object_or_404(Product, pk=product_id)
    productform = ProductForm(instance=product)
    itemformset = modelformset_factory(Item, form = ItemForm, extra=0) 
    items = itemformset(queryset = Item.objects.filter(Product=product_id), prefix='items', )

    if request.method == 'POST':
        productform = ProductForm(request.POST, instance=product)
        items = itemformset(request.POST, queryset = Item.objects.filter(Product=product_id), prefix='items', )

        if productform.is_valid():
            productform.save()
            if items.is_valid():
                items.save()
            else:
                print("fail")

    context = {
        'productform':productform, 
        'product_id': product_id, 
        'items':items,
    }
    return render(request, 'product.html', context ) 

.html

{% bootstrap_form productform %}


    <div class="panel panel-default">
        <div class="panel-heading">
            <h4 class="panel-title">
                <a data-toggle="collapse" data-parent="#accordion" href="#Items"> Items List </a>
            </h4>
        </div>
        <div id="Items" class="panel-collapse collapse">
            <table class="table table-bordered">
                <thead>
                    <tr>
                        <th>Name</th>
                        <th>Tag</th>
                    </tr>
                <thead>
                <tbody>
                    {{ items.management_form }}
                        {% for form in items %}
                            <tr>
                                {{ form.id}}
                                <td> {{ form.Name }} </td>
                                <td> {{ form.Tag }} </td>
                            </tr>
                        {% endfor %}
                </tbody>
            </table>
        </div>
    </div>

1 个答案:

答案 0 :(得分:1)

您正在单独呈现表单字段,但不显示错误。首先,允许Django呈现表单并使视图正常工作。完成后,您可以根据需要自定义模板。

<tbody>
{{ items.management_form }}
{% for form in items %}
    {{ form }}
{% endfor %}
</tbody>

有关详细信息,请参阅有关使用formsets in templates rendering form fields manually的文档。

这样做可以让您看到模板中的错误。另一种选择是打印或记录productform.errorsitems.errors。您当前的print("fail")告诉您存在问题,但不是问题所在。