В настоящее время я работаю над сайтом интернет-магазина, и у меня возникла проблема с обновлением корзины
views.py:
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
from .cart import Cart
from product.models import Product
def add_to_cart(request, product_id):
cart = Cart(request)
cart.add(product_id)
return render(request, 'cart/partials/menu_cart.html')
def cart(request):
return render(request, 'cart/cart.html')
def update_cart(request, product_id, action):
cart = Cart(request)
if action == 'increment':
cart.add(product_id, 1, True)
else:
cart.add(product_id, -1, True)
product = Product.objects.get(pk=product_id)
quantity = cart.get_item(product_id)
if quantity:
quantity = quantity['quantity']
item = {
'product': {
'id': product.id,
'name': product.name,
'image': product.image,
'get_thumbnail': product.get_thumbnail(),
'price': product.price,
},
'total_price': (quantity * product.price) / 100,
'quantity': quantity,
}
else:
item = None
response = render(request, 'cart/partials/cart_item.html', {'item': item})
response['HX-Trigger'] = 'update-menu-cart'
return response
@login_required
def checkout(request):
return render(request, 'cart/checkout.html')
def hx_menu_cart(request):
return render(request, 'cart/partials/menu_cart.html')
def hx_cart_total(request):
return render(request, 'cart/partials/cart_total.html')
cart.html:
{% extends 'main/base.html' %}
{% block title %}Shopping cart | {% endblock %}
{% block content %}
<div class="max-w-6xl mx-auto flex flex-wrap item-start py-6 px-6 xl:px-0">
<div class="products w-full lg:w-3/4">
{% for item in cart %}
{% include 'cart/partials/cart_item.html' %}
{% endfor %}
</div>
<div class="summary w-full md:w-1/4 p-6 bg-gray-100 rounded-xl mt-3">
<h2 class="uppercase text-lg mb-5">Summary</h2>
<div class="mb-6 flex justify-between">
<span class="font-semibold">Total</span>
<span
hx-get="{% url 'hx_cart_total' %}"
hx-trigger="update-menu-cart from:body"
hx-swap="innerHTML">
{% include 'cart/partials/cart_total.html' %}
</span>
</div>
<a href="{% url 'checkout' %}" class="inline block px-8 py-4 rounded-xl bg-cyan-400 hover:bg-cyan-500 text-white">Checkout</a>
</div>
</div>
{% endblock %}
partials/cart_item.html:
{% if item %}
<div class="product mb-6 flex pr-6" id="cart-item-{{ item.product.id }}">
<a href="{% url 'product' item.product.slug %}" class="w-1/4">
<img class="hover:shadow-lg rounded-xl" src="{{ item.product.get_thumbnail }}">
</a>
<div class="w-3/4 pl-6">
<div class="flex justify-between">
<a href="{% url 'product' item.product.slug %}" class="text-lg">{{ item.product.name }}</a>
<span class="mb-6 pt-1 text-gray-400">${{ item.total_price }}</span>
</div>
<hr>
<div class="quantity mt-6 flex items-center space-x-4">
<a
class="p-3 bg-gray-100"
hx-get="{% url 'update_cart' item.product.id 'decrement' %}"
hx-target="#cart-item-{{ item.product.id }}"
hx-swap="outerHTML"
>
-
</a>
<span>{{ item.quantity }}</span>
<a
class="p-3 bg-gray-100"
hx-get="{% url 'update_cart' item.product.id 'increment' %}"
hx-target="#cart-item-{{ item.product.id }}"
hx-swap="outerHTML"
>
+
</a>
</div>
</div>
</div>
{% endif %}
error:
Internal Server Error: /cart/update_cart/3/increment/
Traceback (most recent call last):
File "C:\Users\ALECO TAFO\envs\HitechEnv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "C:\Users\ALECO TAFO\envs\HitechEnv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\ALECO TAFO\Desktop\Hitech website\hitech\cart\views.py", line 45, in update_cart
response = render(request, 'cart/partials/cart_item.html', {'item': item})
File "C:\Users\ALECO TAFO\envs\HitechEnv\lib\site-packages\django\shortcuts.py", line 19, in render
content = loader.render_to_string(template_name, context, request, using=using)
File "C:\Users\ALECO TAFO\envs\HitechEnv\lib\site-packages\django\template\base.py", line 938, in render
bit = node.render_annotated(context)
File "C:\Users\ALECO TAFO\envs\HitechEnv\lib\site-packages\django\template\base.py", line 905, in render_annotated
return self.render(context)
File "C:\Users\ALECO TAFO\envs\HitechEnv\lib\site-packages\django\template\defaulttags.py", line 446, in render
url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
File "C:\Users\ALECO TAFO\envs\HitechEnv\lib\site-packages\django\urls\base.py", line 86, in reverse
return resolver._reverse_with_prefix(view, prefix, *args, **kwargs)
File "C:\Users\ALECO TAFO\envs\HitechEnv\lib\site-packages\django\urls\resolvers.py", line 694, in _reverse_with_prefix
raise NoReverseMatch(msg)
django.urls.exceptions.NoReverseMatch: Reverse for 'product' with arguments '('',)' not found. 1 pattern(s) tried: ['shop\\/(?P<slug>[-a-zA-Z0-9_]+)\\/$']
[02/Aug/2022 01:01:36] "GET /cart/update_cart/3/increment/ HTTP/1.1" 500 135835
У меня нет проблем с функцией уменьшения, она работает отлично, но я не могу увеличить товар (количество товаров в корзине не изменяется, как и цена). Я также покажу вам файлы urls.py из-за ошибки "1 pattern(s) tried", возможно, это поможет вам.
cart/urls.py:
from django.urls import path
from cart.views import add_to_cart, cart, checkout, hx_menu_cart, update_cart, hx_cart_total
urlpatterns = [
path('', cart, name = 'cart'),
path('checkout/', checkout, name = 'checkout'),
path('add_to_cart/<int:product_id>/', add_to_cart, name = 'add_to_cart'),
path('update_cart/<int:product_id>/<str:action>/', update_cart, name = 'update_cart'),
path('hx_menu_cart/', hx_menu_cart, name = 'hx_menu_cart'),
path('hx_cart_total/', hx_cart_total, name = 'hx_cart_total'),
]
main/urls.py:
from django.contrib.auth import views
from django.urls import path
from main.views import frontpage, shop, signup, account, edit_account
from product.views import product
urlpatterns = [
path('', frontpage, name = 'frontpage'),
path('signup/', signup, name = 'signup'),
path('logout/', views.LogoutView.as_view(), name = 'logout'),
path('login/', views.LoginView.as_view(template_name='main/login.html'), name = 'login'),
path('account/', account, name = 'account'),
path('account/edit', edit_account, name = 'edit_account'),
path('shop/', shop, name = 'shop'),
path('shop/<slug:slug>/', product, name = 'product'),
]