【问题标题】:how do I solve Django TypeError - post() got multiple values for argument 'slug'?如何解决 Django TypeError - post() 参数“slug”有多个值?
【发布时间】:2021-06-12 09:35:05
【问题描述】:

我正在创建一个电子商务网站,我是 Django 和 Python 的初学者

我的购物车名称是“Kart”

购物车是会话中的购物车对象。它将购物车存储在会话中。 它在主商店页面中有效,但在 product_details(productView) 中无效

views.py 逻辑将产品添加到购物车中,但它不会作为发布请求重定向到产品页面。我必须点击地址栏并重新加载才能返回产品页面。

Product details page

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'

【问题讨论】:

  • 您的帖子请求中没有正确调用产品。
  • def post(request, slug ):更改为def post(self, request, slug):,因为post是一个方法,将被传递给类的实例。
  • @AbdulAzizBarkat 我这样做了,但它显示页面未找到,顺便说一下,当我将 slug 和 self 放在 'def post(self, request, slug):' url 中的插件更改时到 %3Cslug:slug%3E ex '127.0.0.1:8000/t-kart/product-%3Cslug:slug%3E'
  • @FarhanAhmed 你能回答并告诉你怎么做吗
  • @MohammadSami:请使用{% url ... %},其他链接使用{% 'product-view' slug=product.product_slug %}

标签: python django django-models django-views


【解决方案1】:

您的post 方法应以self 开头:

def post(self, request, slug):
    # …
    pass

如果你不这样做,那么request 将把对象作为值,slug 将接受请求,并且调用中会有一个额外的参数:slug=<i>value-for-slug</i>,因此就像错误所说的那样,您的 slug 参数将有 两个 值,这没有多大意义。

【讨论】:

    猜你喜欢
    • 2019-10-31
    • 2020-03-27
    • 1970-01-01
    • 2021-12-09
    • 2023-03-09
    • 2021-12-18
    • 2017-11-14
    • 2022-11-06
    • 2016-11-09
    相关资源
    最近更新 更多