NoReverseMatch at /cart/
As I delete the item from the cart from the minus button the following error occurs Reverse for 'remove_cart' with arguments '(2,)' not found. 1 pattern(s) tried: ['cart/remove_cart/(?P<product_id>[0-9]+)/(?P<cart_item_id>[0-9]+)/$'] how can I fix it
views.py of carts app
from django.http import HttpResponse
from django.shortcuts import get_object_or_404, redirect, render
from django.core.exceptions import ObjectDoesNotExist
from store.models import Variation
from .models import Cart
from .models import CartItem, Product
# Create your views here.
def _cart_id(request):
cart = request.session.session_key
if not cart:
cart = request.session.create()
return cart
def add_cart(request, product_id):
product = Product.objects.get(id=product_id) #get the product
product_variation = []
if request.method=='POST':
for item in request.POST:
key=item
value=request.POST[key]
try:
variation=Variation.objects.get(product=product, variation_category__iexact=key, variation_value__iexact=value)
product_variation.append(variation)
except:
pass
try:
cart = Cart.objects.get(cart_id = _cart_id(request)) #get the cart using the cart_id present in the session
except Cart.DoesNotExist:
cart = Cart.objects.create(
cart_id = _cart_id(request)
)
cart.save()
is_cart_item_exists = CartItem.objects.filter(product=product, cart=cart).exists()
if is_cart_item_exists:
cart_item = CartItem.objects.filter(product=product, cart=cart)
# existing_variations ->database
# current_variations -> product_variation
# item_id -> database
ex_var_list = []
id = []
for item in cart_item:
existing_variation = item.variations.all()
ex_var_list.append(list(existing_variation))
id.append(item.id)
print(ex_var_list)
if product_variation in ex_var_list:
# increase the cart item quantity
index = ex_var_list.index(product_variation)
item_id = id[index]
item = CartItem.objects.get(product=product, id=item_id)
item.quantity += 1
item.save()
else:
# create a new cart item
item = CartItem.objects.create(product=product, quantity=1, cart=cart)
if len(product_variation) > 0:
item.variations.clear()
item.variations.add(*product_variation)
item.save()
else:
cart_item = CartItem.objects.create(
product = product,
quantity = 1,
cart = cart,
)
if len(product_variation) > 0:
cart_item.variation.clear
cart_item.variations.add(*product_variation)
cart_item.save()
return redirect('cart')
def remove_cart(request, product_id, cart_item_id):
cart = Cart.objects.get(cart_id = _cart_id(request))
product = get_object_or_404(Product, id=product_id)
try:
cart_item = CartItem.objects.get(product = product, cart = cart, id=cart_item_id)
if cart_item.quantity > 1:
cart_item.quantity -= 1
cart_item.save()
else:
cart_item.delete()
except:
pass
return redirect('cart')
def remove_cart_item(request, product_id):
cart = Cart.objects.get(cart_id = _cart_id(request))
product = get_object_or_404(Product, id=product_id)
cart_item = CartItem.objects.get(product = product, cart = cart)
cart_item.delete()
return redirect('cart')
def cart(request, total=0, quantity=0, cart_items= None):
try:
tax = 0
grand_total = 0
cart = Cart.objects.get(cart_id = _cart_id(request))
cart_items = CartItem.objects.filter(cart=cart, is_active=True)
for cart_item in cart_items:
total += (cart_item.product.price * cart_item.quantity)
quantity += cart_item.quantity
tax = (total * 2) / 100
grand_total = total + tax
except ObjectDoesNotExist:
pass # just ignore
context = {
'total': total,
'quantity': quantity,
'cart_items': cart_items,
'tax': tax,
'grand_total': grand_total,
}
return render(request, 'store/cart.html', context)
def __str__(self):
return self.cart_item
urls.py file of the carts app
urlpatterns = [
path('', views.cart, name='cart'),
path('add_cart/<int:product_id>/', views.add_cart, name='add_cart'),
path('remove_cart/<int:product_id>/<int:cart_item_id>/', views.remove_cart, name='remove_cart'),
path('remove_cart_item/<int:product_id>/', views.remove_cart_item, name='remove_cart_item'),
Cart.html file
<div class="input-group-prepend">
<a href="{% url 'remove_cart' cart_item.product.id, cart_item.id %}" class="btn btn-light" type="button" id="button-plus"> <i class="fa fa-minus"></i> </a>
</div>
In the html template when you refer to the remove_cart
url:
<a href="{% url 'remove_cart' cart_item.product.id, cart_item.id %}"
Either cart_item.product.id
or cart_item.id
is nonexistent (I'm guessing the latter), so the template only has one integer argument to pass to the url.
But the url definition requires two integer arguments:
remove_cart/<int:product_id>/<int:cart_item_id>/
Which causes the error.
If you showed us the view function for the cart
url, we might be able to point out the specific cause.