#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. Спасибо — да, это ошибка, которую я сейчас исправил. спасибо, что помогли мне