#python #django #django-models #django-views
Вопрос:
Я создаю сайт электронной коммерции и я новичок в Django и Python
Моя тележка называется «Картинг».
Корзина-это объект корзины в сеансе. Он хранит корзину в сеансе. он работает на главной странице магазина, но не работает в product_details(ProductView)
В views.py логика добавляет товар в корзину, но не перенаправляет на страницу товара в качестве запроса на публикацию. Мне нужно нажать на адресную строку и перезагрузить снова, чтобы вернуться на страницу продукта.
Страница с подробной информацией о продукте
Views.py
class productView(View):
def post(request, slug ):
product = request.POST.get('product')
remove = request.POST.get('remove')
kart = request.session.get('kart')
if kart:
quantity = kart.get(product)
if quantity:
if remove:
if quantity <=1:
kart.pop(product)
else:
kart[product] = quantity-1
else:
kart[product] = quantity 1
else:
kart[product] = 1
else:
kart = {}
kart[product] = 1
request.session['kart'] = kart
return redirect('product-view', slug=slug)
def get(self,request, slug):
product = Product.objects.filter(product_slug=slug)
return render(request, 'T_kart/ProductView.html', {'product': product[0]})
urls.py
from django.contrib import admin
from django.urls import path
from . import views
app_name = 'T_kart'
urlpatterns = [
path('', views.index.as_view(), name="T-kart-Home"),
path('product-<slug:slug>/', views.productView.as_view(), name="product-view"),
path('kart/', views.kart.as_view(), name="kart"),
path('checkout/', views.checkout, name="checkout"),
path('search/', views.search, name="search"),
path('wishlist/', views.wishlist, name="wishlist"),
]
Шаблон (html)
<div style="display: flex; align-items: center; justify-content: center; margin-top: 30px ">
<form action="/t-kart/product-{{product.product_slug}}/" method="post">
{% csrf_token %}
<input type="text" hidden name="product" value="{{product.id}}">
<input type="text" hidden name="remove" value="True">
<input id='minus' type="submit"
class="u-btn-1 u-button-style u-custom-color-1 u-text-hover-custom-color-1 minus"
style="padding: 10px; width: 44px; margin: 0;" value="-"></input>
</form>
<span id='val' class='u-custom-font' style="margin: 7px;">{{ product|cart_product_qty:request.session.kart}} in kart</span>
<form action="/t-kart/product-{{product.product_slug}}/" method="post">
{% csrf_token %}
<input type="text" hidden name="product" value="{{product.id}}">
<input id='plus' type="submit"
class=' u-btn-1 u-button-style u-custom-color-1 u-text-hover-custom-color-1 plus'
style="padding: 10px; width: 44px; margin: 0;" value=" "></input>
</form>
</div>
<form action="/t-kart/product-{{product.product_slug}}/" method="POST">
{% csrf_token %}
<input type="text" hidden name="product" value="{{product.id}}">
<input type="submit" class="
u-align-center-sm
u-align-center-xs
u-btn
u-button-style
u-custom-color-1
u-hover-custom-color-2
u-text-custom-color-3
u-text-hover-custom-color-1
u-btn-1
" value="Add to Kart"></input>
</form>
Обратная связь
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/core/handlers/base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/views/generic/base.py", line 70, in view
return self.dispatch(request, *args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/views/generic/base.py", line 98, in dispatch
return handler(request, *args, **kwargs)
Exception Type: TypeError at /t-kart/product-APPLE-iPhone-11-Black-64-GB/
Exception Value: post() got multiple values for argument 'slug'
Комментарии:
1. Ваш клиент неправильно назвал продукт в своем почтовом запросе.
2. Измените
def post(request, slug ):
наdef post(self, request, slug):
какpost
метод, и вам будет передан экземпляр класса.3. @AbdulAzizBarkat я сделал это, но это показывает, что страница не найдена, кстати, когда я положил пулю и вместе в деф должность(самостоятельно, запрос, слизень):’ plugin в URL-адрес изменяется на <slug:пули%3Е экс ‘ <a rel=»noreferrer noopener nofollow» href=»http://127.0.0.1:8000/t-kart/product-/» rel=»nofollow noreferrer»> 127.0.0.1:8000/т-картинг — /продукта-<slug:пули%3Э ‘
4. @FarhanAhmed можете ли вы ответить и рассказать, как это сделать
5. @MohammadSami: пожалуйста , используйте
{% url ... %}
, то{% 'product-view' slug=product.product_slug %}
же самое для других ссылок.
Ответ №1:
Ваш post
метод должен начинаться с self
:
def post(self, request, slug):
# …
pass
Если вы этого не сделаете, то request
примете в качестве значения объект, slug
примете запрос, и в вызове будет дополнительный параметр: slug=value-for-slug
, следовательно, как говорится в ошибке, ваш slug
параметр будет иметь два значения, что не имеет особого смысла.