Ошибка Django NoReverseMatch при попытке подключиться к своему URL - PullRequest
0 голосов
/ 13 октября 2019

Я получаю ошибку NoReverseMatch, когда пытаюсь подключиться к своему URL, и я не уверен, в чем проблема. Спасибо за любую помощь. Вот мой код:

cart / models.py

from shop.models import Product

class Cart(models.Model):
    cart_id = models.CharField(max_length=250, blank = True)
    date_added = models.DateField(auto_now_add = True)
    class Meta:
        db_table = 'Cart'
        ordering = ['date_added']

    def __str__(self):
        return self.cart_id

class CartItem(models.Model):
    product = models.ForeignKey(Product, on_delete = models.CASCADE)
    cart = models.ForeignKey(Cart, on_delete=models.CASCADE)
    quantity = models.IntegerField()
    class Meta:
        db_table = 'CartItem'

    def sub_total(self):
        return self.product.price * self.quantity

    def __str__(self):
        return self.product

cart / views.py

Кажется, что ошибка связана сздесь метод add_cart, говорящий, что для него нет обратного хода.

from shop.models import Product
from .models import Cart, CartItem
from django.contrib import messages
from django.core.exceptions import ObjectDoesNotExist

def _cart_id(request):
    cart = request.session.session_key
    if not cart:
        cart = request.session.create()
    return cart


def add_cart(request, product_id):
    product = Product.objects.get(id=product_id)
    try:
        cart = Cart.objects.get(cart_id=_cart_id(request))
    except Cart.DoesNotExist:
        cart = Cart.objects.create(
                cart_id = _cart_id(request)
            )
        cart.save()
    try:
        cart_item = CartItem.objects.get(product=product, cart=cart)
        if cart_item.quantity < cart_item.product.stock:
            cart_item.quantity += 1
            cart_item.save()
        else:
            messages.add_message(request, messages.INFO,
                    'Sorry, no more available!')
    except CartItem.DoesNotExist:
        cart_item = CartItem.objects.create(
            product = product,
            quantity = 1,
            cart = cart
        )
        cart_item.save()
    return redirect('cart_detail')

def cart_detail(request, total=0, counter=0, cart_items=0):
    try:
        cart = Cart,objects.get(cart_id=_cart_id(request))
        cart_items = CartItem.objects.filter(cart=cart)
        for cart_item in cart_items:
            total += (cart_item.product_price * cart_item.quantity)
            counter += cart_item.quantity
    except ObjectDoesNotExist:
        pass
    return render(request, 'cart.html', dict(cart_items = cart_items, total = total, counter = counter))

cart / urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('add/<int:product_id>/', views.add_cart, name='add_cart'),
    path('', views.cart_detail, name='cart_detail'),
]

urls.py

from django.contrib import admin
from django.urls import path, include

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

Ошибка enter image description here

1 Ответ

1 голос
/ 13 октября 2019

Эта проблема возникает, когда вы пытаетесь изменить URL-адрес без предоставления необходимых параметров для вашего URL-адреса. Есть 2 случая, которые могут вызвать эту проблему:

  1. Вы резервируете URL для просмотра add_cart, используя from django.urls import reverse (взгляните на свой магазин):
    # ERROR. It will cause if you're not put any input data on it as your urls defined - missing product_id
    url = reverse('app_name:add_cart')

    # PASS
    url = reverse('app_name:add_cart', kwargs={'product_id': 4})
В вашем шаблоне представления shop, если вы используете тег url:

Эта проблема также возникает, если вы не поместили product_id в тег url.

<form method="POST" action="{% url 'app_name:add_cart' %}">

</form>

Итак, предположим, что это:

<form method="POST" action="{% url 'app_name:add_cart' product_id=your_product_id %}">

</form>

Надеюсь, это предоставило достаточно информации для решения проблемы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...