Это мой код. Когда я не пишу path('remove/<int:product_id>/', views.cart_detail, name='cart_remove'),
в urls.py
, он работает нормально, но когда я пишу приведенный выше код, я получаю следующую ошибку:
Reverse for 'cart_add' with arguments '('',)' not found. 1 pattern(s) tried: ['cart/(?P[0-9]+)/$']
Файлы:
urls.py
from django.urls import path
from . import views
app_name = 'cart'
urlpatterns = [
path('<int:id>/', views.cart_add, name='cart_add'),
path('remove/<int:product_id>/', views.cart_detail, name='cart_remove'),
path('detail/', views.cart_detail, name='cart_detail'),
]
views.py
def cart_add(request, id):
if request.method == 'POST':
cart_form = CartAddProductForm(request.POST)
if cart_form.is_valid():
if not cart_form.cleaned_data['update']:
product_id = str(id)
session = request.session
cart = session.get(settings.CART_SESSION_ID)
if not cart:
cart = request.session[settings.CART_SESSION_ID] = {}
if product_id in cart:
cart[product_id]['quantity'] = cart_form.cleaned_data['quantity']
else:
cart[product_id] = {'quantity': cart_form.cleaned_data['quantity']}
session[settings.CART_SESSION_ID] = cart
session.modified = True
else:
pass
return redirect('shop:product_list')
def cart_detail(request, product_id=None):
cart_item = request.session.get(settings.CART_SESSION_ID)
total_price = 0
if not product_id:
add = [k for k in cart_item.keys()]
for key in add:
product_id = int(key)
product = get_object_or_404(Product, id=product_id)
total_price_per_item = cart_item[key]['quantity'] * product.price
cart_item[key]['product'] = product
cart_item[key]['total_price_per_item'] = total_price_per_item
cart_item[key]['update_quantity_form'] = CartAddProductForm(
initial = {'quantity': cart_item[key]['quantity'],
'update': True})
total_price += total_price_per_item
else:
if product_id in cart_item:
del cart_item[product_id]
return render(request, 'cart/detail.html', {'cart': cart_item, 'total_price': total_price})
detail.html
<td>
<form action = "{% url 'cart:cart_add' product.id %}" method = "post">
{{ item.update_quantity_form.quantity }}
{{ item.update_quantity_form.update }}
<input type = "submit" value = "Update">
{% csrf_token %}
</form>
</td>
<td><a href = "{% url 'cart:cart_remove' product.id %}">Remove</a></td>
<td class = "num">${{ product.price }}</td>
<td class = "num">${{ item.total_price_per_item }}</td>
urlpatterns = [путь ('admin /', admin.site.urls), путь ('cart /', include ('cart.urls', namespace = 'cart')), путь ('', include ('shop. urls ', namespace =' shop ')),]
from django.contrib импортировать admin из пути импорта django.urls, включить из настроек импорта django.conf из django.conf.urls.static import static urlpatterns = [path ('admin /', admin.site.urls), path (' cart / ', include (' cart.urls ', namespace =' cart ')), путь (' ', include (' shop.urls ', namespace =' shop ')),]
Думаю, мне это не нужно.
Думаю, я понял: в вашей форме product.id пуст. Другими словами, <int: id> не указан, поэтому шаблон не совпадает.
В detail.html я использовал product.name и product.price, которые отлично работают, так почему бы не product.id?
product.name и product.price могут быть пустыми. Но product.id в качестве аргумента для URL-адреса нет. Для отладки: удалите часть URL и просто визуализируйте product.id, например PRODUCTID: {{ product.id }}
, просто чтобы посмотреть, есть ли он там.
да, это есть. Я это проверяю.
это целое число?
он работает нормально, когда я удаляю URL-адрес корзины: cart_remove, тогда эта ошибка была удалена
да, это целое число
Код мне нравится. Я полагаю, что вы удалили некоторые части, чтобы предоставить нам минимальный рабочий пример. Но настоящая ошибка где-то в вырезанной части.
Не могли бы вы показать мне соответствующую часть проекта urls.py?