Django href 用于 django 购物车的递减和递增错误
Django href for decrement and increment error for a django cart
我正在做我的第一个 Django 项目。我正在创建一个电子商务商店,我遇到了一个我不知道如何解决的问题。
这是关于一个个性化的购物车,我试图在其中增加和减少购物车中的产品。
urls.py
urlpatterns = [
.......
path("cart/<int:id>/", views.increment, name="increment"),
path("cart/<int:id>/", views.decrement, name="decrement"),
path("cart/<int:pk>/", views.CartItemDelete.as_view(), name='cart_delete'),
.....]
views.py
def increment(request, id):
if request.method == "GET":
item = UserItem.objects.get(pk=int(id))
if 0 < (item.quantity + 1) <= item.prod_id.quantity:
item.quantity += 1
item.save()
return redirect('cart')
return redirect('cart')
def decrement(request, id):
if request.method == "GET":
item = UserItem.objects.get(pk=int(id))
if 0 < (item.quantity - 1) <= item.prod_id.quantity:
item.quantity -= 1
item.save()
return redirect('cart')
return redirect('cart')
class CartItemDelete(DeleteView):
model = UserItem
template_name = "cart_delete.html"
context_object_name = "crt"
success_url = reverse_lazy("cart")
模板
<div class="card" id="cardDisplay">
<img class="card-img-top" src="{{ prd.img.url }}" alt="Card image" id="image_prod">
<div class="card-body">
<h4 class="card-title"> {{ prd.name }}</h4>
<form action="{% url 'cart_qu' %}" method="get">
<label>
Quantity: <input type="number" name="quantity" min="1" value="{{ prd.quantity }}" >
<input type="hidden" name="{{ prd.pk }}">
</label>
</form>
<a href="{% url "increment" prd.pk %}"><button>+</button></a>
<a href="{% url "decrement" prd.pk %}"><button>-</button></a><br>
<a href="{% url 'cart_delete' prd.pk %}">Delete</a>
<p class="card-text">Price: {{ prd.price }} lei <br>
</div>
我的问题是,当我单击“+”按钮、“-”按钮或“删除”时,在 views.py 中它仅被调用 increment() 函数。如果我点击“-”,它会增加额外的数量而不是减少,对于删除也是如此......而不是删除,它会将产品数量增加 1。在我看来,事情似乎没问题。我不明白我错在哪里。如果有人可以提供帮助,我将不胜感激!
非常感谢您的宝贵时间!
Django 将使用匹配传入路径的 first url 服务请求,您的所有路径相互冲突(匹配相同的传入路径)但是“增量”是第一个,因此所有请求都将发送给它。
您需要更改路径,以免它们相互冲突
urlpatterns = [
path("cart/<int:id>/increment/", views.increment, name="increment"),
path("cart/<int:id>/decrement/", views.decrement, name="decrement"),
path("cart/<int:pk>/", views.CartItemDelete.as_view(), name='cart_delete'),
]
我正在做我的第一个 Django 项目。我正在创建一个电子商务商店,我遇到了一个我不知道如何解决的问题。 这是关于一个个性化的购物车,我试图在其中增加和减少购物车中的产品。
urls.py
urlpatterns = [
.......
path("cart/<int:id>/", views.increment, name="increment"),
path("cart/<int:id>/", views.decrement, name="decrement"),
path("cart/<int:pk>/", views.CartItemDelete.as_view(), name='cart_delete'),
.....]
views.py
def increment(request, id):
if request.method == "GET":
item = UserItem.objects.get(pk=int(id))
if 0 < (item.quantity + 1) <= item.prod_id.quantity:
item.quantity += 1
item.save()
return redirect('cart')
return redirect('cart')
def decrement(request, id):
if request.method == "GET":
item = UserItem.objects.get(pk=int(id))
if 0 < (item.quantity - 1) <= item.prod_id.quantity:
item.quantity -= 1
item.save()
return redirect('cart')
return redirect('cart')
class CartItemDelete(DeleteView):
model = UserItem
template_name = "cart_delete.html"
context_object_name = "crt"
success_url = reverse_lazy("cart")
模板
<div class="card" id="cardDisplay">
<img class="card-img-top" src="{{ prd.img.url }}" alt="Card image" id="image_prod">
<div class="card-body">
<h4 class="card-title"> {{ prd.name }}</h4>
<form action="{% url 'cart_qu' %}" method="get">
<label>
Quantity: <input type="number" name="quantity" min="1" value="{{ prd.quantity }}" >
<input type="hidden" name="{{ prd.pk }}">
</label>
</form>
<a href="{% url "increment" prd.pk %}"><button>+</button></a>
<a href="{% url "decrement" prd.pk %}"><button>-</button></a><br>
<a href="{% url 'cart_delete' prd.pk %}">Delete</a>
<p class="card-text">Price: {{ prd.price }} lei <br>
</div>
我的问题是,当我单击“+”按钮、“-”按钮或“删除”时,在 views.py 中它仅被调用 increment() 函数。如果我点击“-”,它会增加额外的数量而不是减少,对于删除也是如此......而不是删除,它会将产品数量增加 1。在我看来,事情似乎没问题。我不明白我错在哪里。如果有人可以提供帮助,我将不胜感激! 非常感谢您的宝贵时间!
Django 将使用匹配传入路径的 first url 服务请求,您的所有路径相互冲突(匹配相同的传入路径)但是“增量”是第一个,因此所有请求都将发送给它。
您需要更改路径,以免它们相互冲突
urlpatterns = [
path("cart/<int:id>/increment/", views.increment, name="increment"),
path("cart/<int:id>/decrement/", views.decrement, name="decrement"),
path("cart/<int:pk>/", views.CartItemDelete.as_view(), name='cart_delete'),
]