I'm trying to create a view where users can view and add all products from a custom model that inherits from Product to their cart. I feel like I've gotten close with a formset using Cartridge's stock AddProductForm but am hitting an
"__init__() got multiple values for keyword argument 'data'" error on
line 62 of Cartridge's forms.py. Here are some of the core relevant file sections:
from mezzanine.core.views import direct_to_template
from .models import RetailProduct
from django.utils.functional import curry
from django.forms.formsets import formset_factory
from cartridge.shop.forms import AddProductForm
...
def product_formset(request):
to_cart = (request.method == "POST" and
request.POST.get("add_wishlist") is None)
products = RetailProduct.objects.all()
ProductFormSet = formset_factory(AddProductForm, extra = len(products))
for product in products:
ProductFormSet.form = staticmethod(curry(AddProductForm, request.POST or None, product=product, to_cart=to_cart))
if request.method == 'POST':
data = request.POST.copy()
formset = ProductFormSet(request.POST)
for form in formset:
if form.is_valid():
quantity = form.cleaned_data["quantity"]
request.cart.add_item(form.variation, quantity)
else:
formset = ProductFormSet()
return direct_to_template(request, 'product_formset.html', {'formset': formset})
...
class RetailProduct(Product):
tile_info = models.CharField(max_length = 64, null = True, blank = True)
tile_image = models.ImageField(upload_to="product-images")
nutritional_label = models.ImageField(upload_to="nutritional-labels")
def __unicode__(self):
return "Product: %s" % (self.title)
{% extends 'base.html' %}
{% load mezzanine_tags shop_tags %}
{% block content %}
<form method="post" action="">{% csrf_token %}
<table>
{{ formset }}
<input class="form-button pull-right" name="add_cart" type="submit" value="add to cart" />
</table>
</form>
{% endblock %}