Я хочу использовать formset_factory, чтобы позволить пользователю добавлять несколько товаров с помощью кнопки «Добавить в корзину».
forms.py:
class CartAddItemForm2(forms.Form):
item_id = forms.IntegerField()
quantity = forms.IntegerField()
update = forms.BooleanField(required=False,
initial=False,
widget=forms.HiddenInput)
CartAddItemFormset = formset_factory(CartAddItemForm2, extra=1)
views.py:
cart_item_formset = CartAddItemFormset()
...
return render(request, template_name,
{'item': item,
...
'cart_item_formset': cart_item_formset,
'setting': setting})
Еще одна функция cart_add () для обработки сообщения:
@require_POST
def cart_add(request):
"""
Add multiple items to the cart/quote
"""
cart = Cart(request)
formset = CartAddItemFormset(request.POST)
if formset.is_valid():
idx = 0
for form in formset:
cd = form.cleaned_data
item = get_object_or_404(Item, id=cd['item_id'])
quantity = cd['quantity']
if quantity > 0:
cart.add(item=item,
quantity=quantity,
update_quantity=cd['update'])
idx = idx + 1
return redirect('cart:cart_detail')
Я использовал Bootstrap для HTML, поэтому я должен написать шаблон вручную. Пример кода для шаблона показан здесь.
<td class="py-4 text-center">
<input value="1" name="form-0-quantity" id="id_form-0-quantity" class="text-center">
<input type="hidden" name="form-0-item_id" value="{{ item.id }}" id="id_form-0-item_id">
<input type="hidden" name="form-0-update" value="False" id="id_form-0-update">
</td>
{% for accessory in item.sorted_accessories %}
<tr>
<td class="py-4 text-center">{{ accessory.code }}</td>
<td class="py-4 text-center">{{ accessory.name|truncatechars:54 }}</td>
<td class="py-4 text-center">${{ accessory.price }}</td>
<td class="py-4 text-center">
<input value="1" name="form-{{forloop.counter}}-quantity" id="id_form-{{forloop.counter}}-quantity" class="text-center">
<input type="hidden" name="form-{{forloop.counter}}-item_id" value="{{ accessory.id }}" id="id_form-{{forloop.counter}}-item_id">
<input type="hidden" name="form-{{forloop.counter}}-update" value="False" id="id_form-{{forloop.counter}}-update">
</td>
</tr>
{% endfor %}
Проблема:
- Когда я устанавливаю extra = 1 в formset_factory, я могу добавить только основной элемент в корзину .
- Когда я устанавливаю extra = 2 в formset_factory, кроме основного предмета, я могу добавить только один дополнительный аксессуар (предмет) в корзину.
- Один первичный предмет может иметь случайное количество аксессуаров , Как я могу установить дополнительные =? в formset_factory?