/ cart / add-to-cart / 1 /处的NoReverseMatch与'single_product'反向,但未找到参数。尝试了1种模式:['products /(?P <slug>。*)/ $']

时间:2019-07-17 19:19:11

标签: python django django-templates django-views

有一个功能add_to_cart的用户想将其重定向到由single_product函数提供的产品详细信息页面,该页面对产品ID的要求不高,无法解决该问题。得到此错误

  

带有参数'('s','l','u','g')'的'single_product'的反向   未找到。尝试了1种模式:['products /(?P。*)/ $']

def add_to_cart(request,**kwargs):
     product = Product.objects.filter(id=kwargs.get('item_id', "")).first()
    # check if the user already owns this product
    ----------------

    -------------
    messages.info(request, "item added to cart")
    return redirect(reverse('products:single_product',args=('slug')))

用于查看产品详细信息的网址

url(r'^(?P<slug>.*)/$',single, name="single_product"),

1 个答案:

答案 0 :(得分:0)

由于args应该包含一个 single 参数,因此您需要构造一个 singleton元组。您可以通过在末尾添加逗号来实现:

def add_to_cart(request,**kwargs):
    # ...
    return redirect(reverse('products:single_product',args=(product.slug,)))
    #                                                   singleton tuple ^

请注意,但是您可以直接在redirect(..) function [Django-doc]中编写参数,在这种情况下,redirect(..)本身将调用reverse(..) [Django-doc],如文档中所指定:

  

参数可以是:

     
      
  • 模型:将调用模型的get_absolute_url()函数。
  •   
  • 视图名称,可能带有参数reverse()将用于反向解析名称。
  •   
  • 绝对或相对URL,将按原样用作重定向位置。
  •   

所以重定向到该视图的更紧凑的形式就是:

def add_to_cart(request,**kwargs):
    # ...
    return redirect('products:single_product', product.slug)
    #                     positional parameter ^

或更详细:

def add_to_cart(request,**kwargs):
    # ...
    return redirect('products:single_product', slug=product.slug)
    #                          named parameter ^

redirect(..)使用*args**kwargs,因此在这里您不需要传递元组或字典。

如果您的Product类具有get_absolute_url方法,则可以简单地传递product对象:

def add_to_cart(request,**kwargs):
    product = Product.objects.filter(id=kwargs.get('item_id', "")).first()
    # ...
    return redirect(product)

但是请注意,如果productNone,则上述方法当然会失败,因为None没有get_absolute_url方法。