Не могу понять, как исправить ошибку 'cart_add' with arguments '('',)' not found. 1 pattern(s) tried: ['cart/add/(?P<product_id>[0-9]+)/\\Z']

В шаблоне представления деталей товара есть форма, которая не работает и выдает ошибку.

Вот мой код:

cart/cart.py

from decimal import Decimal
from django.conf import settings
from TeaYardApp.models import Products


class Cart(object):

    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):
        product_ids = self.cart.keys()
        product = Products.objects.filter(id__in=product_ids)

        cart = self.cart.copy()
        for product in product:
            cart[str(product.id)]['product'] = product

        for item in cart.values():
            item['price'] = Decimal(item['price'])
            item['total_price'] = item['price'] * item['quantity']
            yield item

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

    def add(self, product, quantity=1, update_quantity=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_quantity:
            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 get_total_price(self):
        return sum(Decimal(item['price']) * item['quantity'] for item in self.cart.values())

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

cart/Views.py

from django.shortcuts import render, redirect, get_object_or_404
from django.views.decorators.http import require_POST
from TeaYardApp.models import Products
from .cart import Cart
from .forms import CartAddProductForm


@require_POST
def cart_add(request, product_id):
    cart = Cart(request)
    product = get_object_or_404(Products, id=product_id)
    form = CartAddProductForm(request.POST)
    if form.is_valid():
        cd = form.cleaned_data
        cart.add(product=product,
                 quantity=cd['quantity'],
                 update_quantity=cd['update'])
    return redirect('cart:cart_detail')


def cart_remove(request, products_id):
    cart = Cart(request)
    product = get_object_or_404(Products, id=products_id)
    cart.remove(product)
    return redirect('cart:cart_detail')


def cart_detail(request):
    cart = Cart(request)
    for item in cart:
        item['update_quantity_form'] = CartAddProductForm(initial={'quantity': item['quantity'],
                                                                   'update': True})
    return render(request, 'Cart/detail.html', {'cart': cart})

cart/forms.py

from django import forms

PRODUCT_QUANTITY_CHOICES = [(i, str(i)+'г.') for i in range(25, 200+1, 25)]


class CartAddProductForm(forms.Form):
    quantity = forms.TypedChoiceField(
        choices=PRODUCT_QUANTITY_CHOICES,
        coerce=int)
    update = forms.BooleanField(required=False,
                                initial=False,
                                widget=forms.HiddenInput)

cart/urls.py nhfdrryghyuyt

from django.urls import path
from .views import *

app_name = 'cart'

urlpatterns = [
    path('', cart_detail, name='cart_detail'),
    path('add/<int:product_id>/',
         cart_add,
         name='cart_add'),
    path('remove/<int:product_id>/',
         cart_remove,
         name='cart_remove'),
]

шаблон, в котором возникает ошибка, TeaYardApp/view_products.html

{% extends 'base.html' %}
{% load static %}

{% block title %}
{{ block.super }}
{% endblock %}

{% block content %}
<main>
    <div class="col">
        <div class="card shadow-sm">
            <svg class="bd-placeholder-img card-img-top" width="100%" height="225" xmlns="http://www.w3.org/2000/svg"
                 role="img" aria-label="Placeholder: Thumbnail" preserveAspectRatio="xMidYMid slice" focusable="false">
                <rect width="100%" height="100%" fill="#55595c"/>
                {% if item.photo %}
                <image class="model_photo" x="0" y="0" width="100%" height="100%" href="{{ item.photo.url }}"/>
                {% else %}
                <image class="model_photo" x="0" y="0" width="100%" height="100%"
                       href="{% static 'PDF/no_image.png' %}"/>
                {% endif %}
            </svg>

            <div class="card-body"><h5 class="card-title">{{ products_item.title }}</h5>
                <p class="card-text">{{ products_item.description }}</p>
                <div class="d-flex justify-content-between align-items-center">
<!--                    <div class="btn-group">-->
<!--                        <button type="submit" class="btn btn-sm btn-outline-secondary">В корзину</button>-->
<!--                    </div>-->
                    <small class="text-muted">{{ products_item.price }}</small>
                </div>
            <form action="{% url 'cart:cart_add' product.id %}" method="post">
                {{ cart_product_form }}
                <input type="submit" value="Add to cart">
                {% csrf_token %}
            </form>
            </div>
        </div>
    </div>
</main>
{% endblock %}

TeaYardApp/models.py fgtrtfhjgjkhutyujy

from django.db import models
from django.urls import reverse


class Products(models.Model):
    title = models.CharField(max_length=50)
    description = models.TextField()
    photo = models.ImageField(upload_to='photos/%Y/%M/%D/', blank=True)
    price = models.CharField(max_length=50)
    available = models.BooleanField(default=True)
    category = models.ForeignKey('Category', on_delete=models.PROTECT)

    def get_absolute_url(self):
        return reverse('view_products', kwargs={"products_id": self.pk})

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = 'Товар'
        verbose_name_plural = 'Товары'
        ordering = ['category']


class Category(models.Model):
    title = models.CharField(max_length=150, db_index=True)

    def get_absolute_url(self):
        return reverse('category', kwargs={"category_id": self.pk})

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = 'Категория'
        verbose_name_plural = 'Категории'
        ordering = ['title']

Есть много информации о следующей ошибке. fgfghjgjjkulitj Пожалуйста, помогите

Ваша проблема здесь:

{% url 'cart:cart_add' product.id %}

Я не вижу, передаете ли вы какой-либо объект Product этому представлению. Django пытается обработать {% url %} без Product, поэтому он передает None переменную и выдает эту ошибку.

Вернуться на верх