Ошибка во время рендеринга шаблона: несоответствие в /products/product-3/

#python #django #django-views

#python #django #django-просмотры

Вопрос:

Не могли бы вы помочь мне понять приведенную ниже ошибку? Я изучаю Django и действительно придерживаюсь обратного рендеринга представлений. Когда я нажимаю на ссылку продукта, она должна перейти на страницу продукта, но выдает ошибку.

В моем анализе я вставил операторы печати в единую функцию продукта и мог видеть в терминале, что программа работает нормально, пока не перейдет к отображению представления, помогает ли это?

из терминала

 15/Nov/2020 22:49:59] "GET /products/ HTTP/1.1" 200 7582
<WSGIRequest: GET '/products/product-3/'>
{'product': <Product: Product 3>, 'images': <QuerySet []>}
products/single.html
Internal Server Error: /products/product-3/
Traceback (most recent call last):
  

Ошибка
Несоответствие в /products/product-3/
Обратный для ‘add_to_cart’ не найден. ‘add_to_cart’ не является допустимой функцией просмотра или именем шаблона.
Метод запроса: ПОЛУЧИТЬ
URL-адрес запроса: http://127.0.0.1:8000/products/product-3/
Версия Django: 3.1.3
Тип исключения: NoReverseMatch
Значение исключения:
Обратный для ‘add_to_cart’ не найден. ‘add_to_cart’ не является допустимой функцией просмотра или именем шаблона.

HTML

 {% extends "base.html" %} {% block content %}
<h1>Search for {{ query }}</h1>
{{ product }}

<table class="table">
  <thead>
    <th></th>
    <th>Product</th>
  </thead>
  <tbody>
    {% for product in product_htm %}
    <tr>
      <td>Image</td>
      <td><a href="{ product.get_absolute_url }}"> {{ product }}</a></td>
    </tr>
    {% endfor %}
  </tbody>
</table>
{% endblock %}
  

Модели.py в приложении продукта

 # Create your models here.
class Product(models.Model):
    def get_absolute_url(self):
        return reverse("product_app:single_product", kwargs={"slug": self.slug})
  

продукты views.py

 def single(request, slug):
    product = Product.objects.get(slug=slug)
    images = ProductImage.objects.filter(product=product)
    context = {'product': product, 'images': images}
    template = 'products/single.html'
    print(request)
    print(context)
    print(template)
    return render(request, template, context)
  

приложение продукта urls.py
откуда . импорт представлений

 app_name = 'product_app'

urlpatterns = [
    path('', views.index, name='home'),
    path('s/', views.search),
    path('products/', views.all, name='products'),
    path('products/<slug:slug>/', views.single, name='single_product'),
]
  

корзины urls.py

 from . import views
# import (index, ProductSingleView)

app_name = 'cart_app'

extra_patterns = [
    path('cart/carts/<slug:slug>/', views.add_to_cart),
]
urlpatterns = [
    path('cart/', include(extra_patterns), name='add_to_cart'),
    path('cart/<int:id>', views.remove_from_cart, name='remove_from_cart'),
    path('', views.view, name='cart'),
]
  

корзины views.py

 # Create your views here.
from products.models import Product, Variation
from .models import Cart, CartItem


def view(request):
    try:
        the_id = request.session['cart_id']
    except DoesNotExist:
        the_id = None
    if the_id:
        cart = Cart.objects.get(id=the_id)
        new_total = 0.00
        for item in cart.cartitem_set.all():
            line_total = float(item.product.price) * item.quantity
            new_total  = line_total

        request.session['items_total'] = cart.cartitem_set.count()
        cart.total = new_total
        cart.save()
        
        context = {"cart": cart}
    else:
        empty_message = "Yout cart is empty, please keep shopping"
        context = {"empty": True, "empty_message": empty_message}

    template = "cart/view.html"
    return render(request, template, context)

def remove_from_cart(request, id):
    try:
        the_id = request.session['cart_id']
        cart = Cart.objects.get(id=the_id)
    except:
        return HttpResponseRedirect(reverse('cart_app:cart'))

    cartitem = CartItem.objects.get(id=id)
    cartitem.cart = None
    cartitem.save()
    return HttpResponseRedirect(reverse('cart_app:cart'))

def add_to_cart(request, slug):
    request.session.set_expiry(120)

    try:
        the_id = request.session['cart_id']
    except:
        new_cart = Cart()
        new_cart.save()
        request.session['cart_id'] = new_cart.id
        the_id = new_cart.id

    cart = Cart.objects.filter(id=the_id)

    try:
        product = Product.objects.get(slug=slug)
    except Product.DoesNotExist:
        print("except1")

    product_var = []
    if request.method == "POST":
        qty = request.POST['qty']
        for item in request.POST:
            key = item
            val = request.POST[key]
            try:
                v = Variation.objects.get(product=product, category__iexact=key, title__iexact=val)
                product_var.append(v)
            except Variation.DoesNotExist:
                pass

        cart_item = CartItem.objects.create(cart=cart, product=product)
        print("iam here")
        if len(product_var) > 0:
            # * adds each item
            cart_item.variations.add(*product_var)
        cart_item.quantity = qty
        cart_item.save()


        return HttpResponseRedirect(reverse('cart_app:cart'))
    else:
        return HttpResponseRedirect(reverse('cart_app:cart'))
  

urls.py в электронной коммерции проекта

 from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static

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

Комментарии:

1. вероятно, у вас есть обратное к несуществующему обратному имени в шаблоне

2. Я только что добавил дополнительную информацию к вопросу, надеюсь, это дает некоторые особенности

Ответ №1:

В ваших url_patterns строка с name='add_to_cart' включена. Вычеркните это имя и поместите его в строку extra_patterns . Я думаю, вы пытаетесь назвать include, который может содержать несколько элементов.

 from . import views
# import (index, ProductSingleView)

app_name = 'cart_app'

extra_patterns = [
    path('cart/carts/<slug:slug>/', views.add_to_cart, name='add_to_cart'),
]
urlpatterns = [
    path('cart/', include(extra_patterns)),
    path('cart/<int:id>', views.remove_from_cart, name='remove_from_cart'),
    path('', views.view, name='cart'),
]
  

Комментарии:

1. Отлично, спасибо миллион, ты спас меня. спасибо, что помогли мне

Ответ №2:

Первое, что я вижу, это то, что в вашем HTML-файле есть опечатка. У вас есть только одна левая фигурная скобка для

product.get_absolute_url

Кроме того, при вызове get_absolute_url он возвращает

обратный («product_app:single_product», kwargs={«slug»: self.slug})

Убедитесь, что продукт действительно имеет self.slug , потому что я не могу сказать, соответствует ли класс продукта в ваших моделях.в py есть какие-либо поля.

Пожалуйста, дайте мне знать, если это поможет, я бы с удовольствием попытался помочь.

Комментарии:

1. Спасибо — да, это ошибка, которую я сейчас исправил. спасибо, что помогли мне