2016-05-16 70 views
0

我有一个formset,我试图挽回它。但是,当我尝试检查formset.is_valid()并保存时,即使没有更改formset中的任何内容,验证也总是失败。我正在使用formset显示已经存在的数据并尝试对其进行编辑。我不知道我哪里错了。有人可以帮忙吗? :(Django 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> 
+0

你还没有显示ItemForm,但我想你可能忘记排除'product'字段。由于您想编辑与单个产品相关的所有项目,因此您可能会发现['inlineformset_factory'](https://docs.djangoproject.com/en/1.9/topics/forms/modelforms/#inline-formsets)有用。 – Alasdair

回答

1

您单独渲染表单域,但不显示错误。首先,请允许Django的呈现形式,并获得如果需要,您可以自定义模板。

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

请参阅文档使用formsets in templatesrendering form fields manually了解更多信息。

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

+0

我通过打印items.errors找出原因。它告诉我,我错过了一个必需的领域,它解决了这个问题。非常感谢 :) – hermy67