2016-05-16 14 views
0

私はフォームセットを持っており、私はそれを元に戻そうとしています。しかし、formset.is_valid()をチェックして保存しようとすると、formsetの何も変更されていなくても常に検証が失敗します。私はformsetを使って既に存在するデータを表示していて、それを編集しようとしています。私はどこが間違っているのか分かりません。誰かが助けてくれますか? :(Djangoフォームセットが保存されていません

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'フィールドを除外するのを忘れているかもしれません。 1つの製品に関連するすべての項目を編集したいので、おそらく[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を使用してください。

このようにすると、テンプレートにエラーが表示されるはずです。もう1つの方法は、productform.errorsitems.errorsを印刷または記録することです。あなたの現在のprint("fail")は問題があることを示しますが、問題は何かを示していません。

+0

items.errorsを印刷して理由を調べました。それは、私が必要なフィールドを欠いていて、それが問題を解決したと私に言った。どうもありがとうございます :) – hermy67

関連する問題