私はしばらくの間答えを得ていませんでしたので、以下のより良い解決策は見つかりませんでした。たぶん誰かが役に立つと思うかもしれません。
[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
のチェックボックスをチェックします