@robocop45
Only python

Not Found: /cart/add/1/ — не могу добавить товар в корзину, как исправить?

Реализовываю корзину с помощью sessions. когда нажимаю на кнопку "add to cart" появляется это
Page not found (404)
No ProductVariant matches the given query.
#logs
Not Found: /cart/add/1/


mycart.views
def cart_details(request):
    cart = Cart(request)
    return render(request, 'mycart/cart_details.html', {'cart':cart})

@require_http_methods(["GET", "POST"])
def add_cart(request, variant_id):
    cart = Cart(request)
    product = get_object_or_404(ProductVariant, id=variant_id)
    form = AddProductInCart(request.POST)
    if form.is_valid():
        cd = form.cleaned_data
        cart.add(product=product, quantity=cd['quantity'],update=cd['update'])
    return redirect('mycart:cart_detail')


mycart.cart
from decimal import Decimal

from shop.models import ProductVariant
from test_shop import settings


class Cart:
    def __init__(self, request):
        self.session = request.session
        cart = self.session.get(settings.CART_SESSION_ID)
        if not cart:
            cart = self.session[settings.CART_SESSION_ID] = {}
        self.cart = cart

    def __iter__(self):
        variant_ids = self.cart.keys()
        products = ProductVariant.objects.filter(id__in=variant_ids)
        cart = self.cart.copy()
        for product in products:
            cart[str( product.id)]['variant'] =  product

    def add(self, product, quantity, update=False):
        product_id = str(product.id)
        if product_id not in self.cart:
            self.cart[product_id] = {'quantity': 0,
                                     'price': str(product.price)}
        if update:
            self.cart[product_id]['quantity'] = quantity
        else:
            self.cart[product_id]['quantity'] += quantity
        self.save()

    def save(self):
        self.session.modified = True

    def remove(self, product):
        product_id = str(product.id)
        if product_id in self.cart:
            del self.cart[product_id]
            self.save()


    def __len__(self):
        """len products in cart"""
        return sum(item['quantity'] for item in self.cart.values())

    def get_total_price(self):
        """total_price"""
        return sum(Decimal(item['quantity']) * item['price']for item in self.cart.values())

    def clear(self):
        del self.session[settings.CART_SESSION_ID]
        self.save()


mycart.forms.py
class AddProductInCart(forms.Form):
    quantity = forms.TypedChoiceField(choices=PRODUCT_QUANTITY_CHOICES, coerce=int)
    # size = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple,
    #                                       choices=PRODUCT_QUANTITY_CHOICES)
    update = forms.BooleanField(required=False, initial=False, widget=forms.HiddenInput)



mycart.urls

app_name ='mycart'
urlpatterns = [
    path('', cart_details,name ='cart_detail'),
    path('add/<int:variant_id>/', add_cart,name='add_cart')

]


test_shop.urls
urlpatterns = [
    path('admin/', admin.site.urls),
    path('cart/',include('mycart.urls', namespace='mycart')),
    path('', include('shop.urls')),

]


product_details.py


<form id='CartAddForm' action="{% url 'mycart:add_cart' product.id %}" method="post">
        {{ form }}
        {% csrf_token %}
        <input type="submit" value="Add to cart">
    </form>
  • Вопрос задан
  • 158 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы