I am trying to pass 2 parameters from html tag to the urls in django. But I am getting error: NoReverseMatch. If I pass only one parameter then it is working fine but it is generating error whenever i am passing 2 parameters. I have read the documentation for this but I am not clear about that,,and I have also searched for this issues. But nothing is working. Can You please help me to figure it out how I can I fix this?
My href in html tag is:
<a href='{% url "update_cart" slug=product.slug qty=10 %}' class="float-right">Add to Cart</a>Add to Cart</a>
My urls.py is:
urlpatterns = [
path('', home.Index.as_view(), name='homepage'),
path('signup', signup.SignUp.as_view(), name="signup"),
path('login', login.Login.as_view(), name="login"),
path('logout', login.logout , name="logout"),
path('basket', basket.Basket.as_view() , name="basket"),
path('singlepropa/<str:slug>/<int:qty>', singlepropa.SinglePropa.as_view() , name="singlepropa"),
path('s/', search.Search.as_view() , name="search"),
path('update_cart/<str:slug>/<int:qty>', basket.update_cart , name="update_cart"),
]
The method for the mapped url is:
from django.shortcuts import render, redirect, HttpResponseRedirect
from django.views import View
from MStore.models.cartModel import Cart, CartItem
from MStore.models.productModel import ProductModel
from django.urls import reverse
# login class
class Basket(View):
def get(self, request):
try:
the_id = request.session["cart_id"]
except:
the_id = None
if the_id:
cart = Cart.objects.get(id=the_id)
context = {'cart': cart}
else:
empty_msg = "Your Cart is empty. Please keep shopping!"
context = {"empty": True, "empty_msg": empty_msg }
return render(request, 'basket.html', context)
def update_cart(request, slug, qty):
try:
the_id = request.session["cart_id"]
except:
new_cart = Cart()
new_cart.save()
the_id = new_cart.id
request.session["cart_id"] = new_cart.id
cart = Cart.objects.get(id=the_id)
try:
product = ProductModel.objects.get(slug=slug)
except ProductModel.DoesNotExist:
pass
except:
pass
cart_item, created = CartItem.objects.get_or_create(cart=cart, product=product)
if created:
print("Yeah")
if qty == 0:
cart_item.delete()
else:
cart_item.quantity = qty
cart_item.save()
request.session["item_counts"] = cart.cartitem_set.count()
new_total = 0.00
for p in cart.cartitem_set.all():
line_total = float(p.product.price) * p.quantity
new_total += line_total
cart.total = round(new_total, 2)
cart.save()
return HttpResponseRedirect(reverse("basket"))
The error I am getting:
NoReverseMatch at /
> Reverse for 'singlepropa' with arguments '('mens-shirt-1',)' not found. 1 pattern(s) tried:
> ['singlepropa/(?P<slug>[^/]+)/(?P<qty>[0-9]+)$']
> Request Method: GET
> Request URL: http://127.0.0.1:8000/
> Django Version: 3.1.5
> Exception Type: NoReverseMatch
> Exception Value:
> Reverse for 'singlepropa' with arguments '('mens-shirt-1',)' not found. 1 pattern(s) tried:
> ['singlepropa/(?P<slug>[^/]+)/(?P<qty>[0-9]+)$']
> Exception Location: G:\djangoPro\EMart\venv\lib\site-packages\django\urls\resolvers.py,
> line 685, in _reverse_with_prefix
> Python Executable: G:\djangoPro\EMart\venv\Scripts\python.exe
> Python Version: 3.7.3
> Python Path:
> ['G:\\djangoPro\\NShopping',
> 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python37-32\\python37.zip',
> 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python37-32\\DLLs',
> 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python37-32\\lib',
> 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python37-32',
> 'G:\\djangoPro\\EMart\\venv',
> 'G:\\djangoPro\\EMart\\venv\\lib\\site-packages']
> Server time: Wed, 10 Feb 2021 09:16:40 +0000
Full Traceback:
G:\djangoPro\EMart\venv\lib\site-packages\django\core\handlers\exception.py, line 47, in inner
response = get_response(request) …
▶ Local vars
G:\djangoPro\EMart\venv\lib\site-packages\django\core\handlers\base.py, line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs) …
▶ Local vars
G:\djangoPro\EMart\venv\lib\site-packages\django\views\generic\base.py, line 70, in view
return self.dispatch(request, *args, **kwargs) …
▶ Local vars
G:\djangoPro\EMart\venv\lib\site-packages\django\views\generic\base.py, line 98, in dispatch
return handler(request, *args, **kwargs) …
▶ Local vars
G:\djangoPro\NShopping\MStore\views\home.py, line 24, in get
return render(request, 'index.html', data) …
▶ Local vars
G:\djangoPro\EMart\venv\lib\site-packages\django\shortcuts.py, line 19, in render
content = loader.render_to_string(template_name, context, request, using=using) …
▶ Local vars
G:\djangoPro\EMart\venv\lib\site-packages\django\template\loader.py, line 62, in render_to_string
return template.render(context, request) …
▶ Local vars
G:\djangoPro\EMart\venv\lib\site-packages\django\template\backends\django.py, line 61, in render
return self.template.render(context) …
▶ Local vars
G:\djangoPro\EMart\venv\lib\site-packages\django\template\base.py, line 170, in render
return self._render(context) …
▶ Local vars
G:\djangoPro\EMart\venv\lib\site-packages\django\template\base.py, line 162, in _render
return self.nodelist.render(context) …
▶ Local vars
G:\djangoPro\EMart\venv\lib\site-packages\django\template\base.py, line 938, in render
bit = node.render_annotated(context) …
▶ Local vars
G:\djangoPro\EMart\venv\lib\site-packages\django\template\base.py, line 905, in render_annotated
return self.render(context) …
▶ Local vars
G:\djangoPro\EMart\venv\lib\site-packages\django\template\loader_tags.py, line 150, in render
return compiled_parent._render(context) …
▶ Local vars
G:\djangoPro\EMart\venv\lib\site-packages\django\template\base.py, line 162, in _render
return self.nodelist.render(context) …
▶ Local vars
G:\djangoPro\EMart\venv\lib\site-packages\django\template\base.py, line 938, in render
bit = node.render_annotated(context) …
▶ Local vars
G:\djangoPro\EMart\venv\lib\site-packages\django\template\base.py, line 905, in render_annotated
return self.render(context) …
▶ Local vars
G:\djangoPro\EMart\venv\lib\site-packages\django\template\loader_tags.py, line 62, in render
result = block.nodelist.render(context) …
▶ Local vars
G:\djangoPro\EMart\venv\lib\site-packages\django\template\base.py, line 938, in render
bit = node.render_annotated(context) …
▶ Local vars
G:\djangoPro\EMart\venv\lib\site-packages\django\template\base.py, line 905, in render_annotated
return self.render(context) …
▶ Local vars
G:\djangoPro\EMart\venv\lib\site-packages\django\template\defaulttags.py, line 211, in render
nodelist.append(node.render_annotated(context)) …
▶ Local vars
G:\djangoPro\EMart\venv\lib\site-packages\django\template\base.py, line 905, in render_annotated
return self.render(context) …
▶ Local vars
G:\djangoPro\EMart\venv\lib\site-packages\django\template\defaulttags.py, line 446, in render
url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) …
▶ Local vars
G:\djangoPro\EMart\venv\lib\site-packages\django\urls\base.py, line 87, in reverse
return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs)) …
▶ Local vars
G:\djangoPro\EMart\venv\lib\site-packages\django\urls\resolvers.py, line 685, in _reverse_with_prefix
raise NoReverseMatch(msg)
update_cart has only 1 parameter product slug. and the issue is in singlepropa URL.
<a href='{% url "update_cart" product.slug %}' class="float-right">Add to Cart</a>
<a href='{% url "singlepropa" product.slug 10 %}' class="float-right">Add to Cart</a>
this will fix your issue.
https://docs.djangoproject.com/en/3.1/ref/templates/builtins/#url