I got this error and have no idea why this is coming
ValueError at /add_to_cart/printed-shirt/
Field 'id' expected a number but got 'Green'.
I'm trying to add variations to my product. So when I'm submitting, I'm printing the values the users are selecting by writing print(request.POST.getlist('variations', [])) and those are coming back as ['Red', 'Medium'].
Now I was trying to see if the product matching these variations already exists in the cart. If it exists, then I would increase the quantity, and if it does not exist, then I would add a new item. The error is being thrown at the line
order_item_qs = order_item_qs.filter(
But my code doesn't seem to work. Can anyone please help me with this? Thanks in advance!
My views.py:
@login_required
def add_to_cart(request, slug):
item = get_object_or_404(Item, slug=slug)
variations = request.POST.getlist('variations', [])
print(variations)
minimum_variation_count = Variation.objects.filter(item=item).count()
if len(variations) < minimum_variation_count:
messages.info(request, "Please specify the required variations.")
order_item_qs = OrderItem.objects.filter(
item=item,
user= request.user,
ordered=False,
)
for v in variations:
order_item_qs = order_item_qs.filter(
item_variations__exact=v
)
if order_item_qs.exists():
order_item = order_item_qs.first()
order_item.quantity += 1
order_item.save()
else:
order_item = OrderItem.objects.create(
item=item,
user= request.user,
ordered=False,
)
order_item.item_variations.add(*variations)
order_item.save()
order_qs = Order.objects.filter(user=request.user, ordered=False)
if order_qs.exists():
order = order_qs[0]
if not order.items.filter(item__id=order_item.id).exists():
order.items.add(order_item)
messages.success(request, "Product added to cart.")
return redirect("order-summary")
else:
ordered_date = timezone.now()
order = Order.objects.create(user=request.user, ordered_date=ordered_date)
order.items.add(order_item)
messages.success(request, "Product added to cart.")
return redirect("order-summary")
return redirect("order-summary")
My models.py:
class Item(models.Model):
title = models.CharField(max_length=120)
price = models.FloatField()
class Variation(models.Model):
item = models.ForeignKey(Item, on_delete=models.CASCADE)
name = models.CharField(max_length=50) # size, color
class ItemVariation(models.Model):
variation = models.ForeignKey(Variation, on_delete=models.CASCADE)
value = models.CharField(max_length=50) # small, medium large etc
class OrderItem(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
item = models.ForeignKey(Item, on_delete=models.CASCADE)
item_variations = models.ManyToManyField(ItemVariation)
quantity = models.IntegerField(default=1)
ordered = models.BooleanField(default=False)
class Order(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
ref_code = models.CharField(max_length=20)
ordered = models.BooleanField(default=False)
items = models.ManyToManyField(OrderItem)
start_date = models.DateTimeField(auto_now_add= True)
ordered_date = models.DateTimeField()
My order_summary.html (where I can increase quantity):
<a href="{% url 'remove-single-item-from-cart' order_item.item.slug %}" class="btn mr-2"><i class="fa fa-minus"></i></a>
{{ order_item.quantity }}<a href="{% url 'add-to-cart' order_item.item.slug %}" class="btn ml-2"><i class="fa fa-plus"></i></a>
My urls.py:
path('add_to_cart/<slug>/', orders_views.add_to_cart, name='add-to-cart'),
path('remove_from_cart/<slug>/', orders_views.remove_from_cart, name='remove-from-cart'),