cMe*_*IHo 2 python django django-forms inline-formset
Django 说,我应该这样渲染inline formset:
{{ formset.management_form }}
{% for form in formset %}
{{ form.id }}
{{ form.field_1 }}
{{ form.field_2 }}
<button type="button"> delete </button>
{% endfor %}
<button type="submit"> submit </button>
Run Code Online (Sandbox Code Playgroud)
好的。但是如果我想form动态删除一些表单集对象 ( ) 怎么办?用户按下delete按钮 - 我form从 DOM 中删除,我使用 ajax 删除与form数据库中的对象相关的对象。到目前为止它工作正常。但是当用户点击时submit- 我的 views.py 试图验证表单集:
filled_formset = OrderItemFormSet(request.POST, instance=order)
if filled_formset.is_valid():
Run Code Online (Sandbox Code Playgroud)
并引发错误:
MultiValueDictKeyError at /order/cart/
"'orderitem_set-0-id'"
...\market\ordersys\views.py in show_cart
59. if filled_formset.is_valid():
Run Code Online (Sandbox Code Playgroud)
我认为这是因为formdjango 显示的对象有一定的规律性(第一种形式有 id = orderitem_set-0-id,第二个 =orderitem_set-1-id等)并且当我首先form从 DOM 中删除时,规律性被破坏了 - 没有更多form的orderitem_set-0-id. 但is_valid()仍然试图得到它dict["orderitem_set-0-id"]。
我可以使用一些黑魔法,替换 django 的技术信息,显示在 DOM 中,恢复被破坏的规律,但有没有更好的方法?
你能告诉我如何正确动态删除表单集项目吗?
我有一段时间没有得到答案,所以我没有找到比下面更好的解决方案。也许有人会发现它很有用。
好的,诀窍是 -在你的模板中拥有{{form.DELETE}}任何东西。它呈现为一个复选框(我使它不可见)并且我使 JS 使其在用户按下“删除”按钮时“选中”。用户按下“提交”按钮后,标记为删除的每个将不会在 期间被视图验证。这使您可以在后台使用 ajax 从数据库中删除对象。formformsetformfilled_formset.is_valid()
问题是在表单集验证期间引发了错误。由对象的形式引起,该对象已经用 ajax 从数据库中删除。
所以有所有组件:
视图.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})
Run Code Online (Sandbox Code Playgroud)
购物车.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>
Run Code Online (Sandbox Code Playgroud)
接下来,如果用户按下“删除”按钮,我的JavaScript
1.皮form与$(item).css('display', 'none');
2品牌检查form.DELETE复选框与ItemDelCheckbox.prop('checked', true);
3.从数据库发送Ajax请求删除项(否则,如果用户刷新页面,购物车中仍是项)
视图.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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5103 次 |
| 最近记录: |