Django formset_factory с дополнительным параметром - PullRequest
0 голосов
/ 25 января 2020

Я хочу использовать 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?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...