2017-12-23 12 views
0

が、私はinline formsetこの方法をレンダリングする必要がありますフォームセット。しかし、私はいくつかのformsetオブジェクト(form)を動的に削除したいのですが?ユーザプレスdeleteボタン - DOMからformを削除します。私はajaxを使用してオブジェクトを削除します。これはformに関連しています。この点までは正常に動作します。ユーザーがsubmitをクリックしたときにでも - 私のviews.pyは、フォームセットを検証しようとしている:は、Djangoは言う

filled_formset = OrderItemFormSet(request.POST, instance=order) 
if filled_formset.is_valid(): 

とエラーが発生します。

MultiValueDictKeyError at /order/cart/ 
"'orderitem_set-0-id'" 
...\market\ordersys\views.py in show_cart 
59. if filled_formset.is_valid(): 

私はformオブジェクトはいくつかの規則(最初の形式でジャンゴで表示されたので、それが起こったと思いますgot id = orderitem_set-0-id、second = orderitem_set-1-idなど)そして、DOMから最初にformを削除したときに規則性が破られました。formorderitem_set-0-idがなくなりました。しかし、まだdict["orderitem_set-0-id"]を取得しようとしているis_valid()

DOMに表示されているdjangoの技術情報を黒の魔法に置き換えて、乱れた規則性を復元することができますが、より良い方法がありますか?

フォームセット項目を適切に動的に削除する方法を教えてください。

答えて

0

私はしばらくの間答えを得ていませんでしたので、以下のより良い解決策は見つかりませんでした。たぶん誰かが役に立つと思うかもしれません。

[OK]をクリックすると、formsetテンプレートのformには{{form.DELETE}}が表示されます。それはチェックボックス(私はそれを非表示にしました)としてレンダリングし、私はJSを "チェック"ユーザーが "削除"ボタンを押すたびにするようにしました。ユーザーが「送信」ボタンを押すと、form(削除マークが付いている)はfilled_formset.is_valid()の間にビューによって検証されません。これにより、シーンの背後にあるajaxを使ってデータベースからオブジェクトを削除することができます。

views.py

def show_cart(request): 
    OrderItemFormSet = inlineformset_factory(Order, OrderItem, form=OrderItemForm, extra=0, can_delete=True) 
    order = Order.objects.get(pk=request.session['order']) 

    if request.method == 'GET':                 
     formset = OrderItemFormSet(instance=order) 
     return render(request, 'ordersys/cart.html', {'formset': formset}) 

    elif request.method == 'POST':    
     filled_formset = OrderItemFormSet(request.POST, instance=order) 
     if filled_formset.is_valid():     
      filled_formset.save() 
      return redirect('catalog:index') 
     else: 
      return render(request, 'ordersys/cart.html', {'formset': filled_formset}) 

cart.html

<form action="" method="post"> 
    {{ formset.management_form }} 
    {% for form in formset %} 
     {{ form.id }} 
     {{ form.DELETE|add_class:"not_displayed" }}     # custom filter 
     <img src="{{ form.instance.spec_prod.product.picture.url }}"> 
      {{ form.quantity.label_tag }} 
      {{ form.quantity }} 
      {{ form.errors }} 
      <button type="button">Delete</button> 
    {% endfor %} 
    <button type="submit">Submit</button> 
</form> 

次に、ユーザ押しボタンを '削除' 場合、私はJavaScript

The problem was that an ERROR was raised during formset validation. Caused by the form of an object, which was already deleted from database with ajax.

だから、すべてのコンポーネントがあります 1. form$(item).css('display', 'none');
2.なりますが

views.py

def delete_order_item(request):   # meets the ajax request 
    item_id = int(request.POST['item_id']) 
    order = get_object_or_404(Order, pk=int(request.POST['order_id'])) 
    order.remove_item(item_id) 
    if order.is_empty():     # if the last item is deleted 
     order.untie(request.session) 
     order.delete() 
    return HttpResponse() 
(、ユーザーがページをリフレッシュしそうならば、まだカート内のアイテム)をデータベースから項目を削除するには、Ajaxのリクエストを送信し ItemDelCheckbox.prop('checked', true);
3で form.DELETEのチェックボックスをチェックします
関連する問題