【问题标题】:NoReverseMatch at /cart/add-to-cart/1/ Reverse for 'single_product' with arguments not found. 1 pattern(s) tried: ['products/(?P<slug>.*)/$']/cart/add-to-cart/1/ 的 NoReverseMatch 为未找到参数的“single_product”反向。尝试了 1 种模式:['products/(?P<slug>.*)/$']
【发布时间】:2019-11-26 16:45:49
【问题描述】:

我有一个函数 add_to_cart 想要反向重定向到由 single_product 函数呈现的产品详细信息页面,该函数具有产品 id 的 slug,无法找到解决它的方法。出现此错误

使用参数 '('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"),

【问题讨论】:

    标签: python django django-templates django-views


    【解决方案1】:

    由于args应该包含一个single参数,你需要构造一个singleton tuple。您可以通过在末尾添加逗号来做到这一点:

    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)

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

    【讨论】:

    • 是否反向省略?
    • @Cipher:正如redirect(..) 上的文档所述,您可以传递“视图名称,可能带有参数:reverse() 将用于反向解析名称。”。
    • 这两个选项都不起作用错误没有产品进行查询并且没有名为 slug 的模块,因此 url 转到 /products/slug/ 而不是 /products/productname/
    • @Cipher:但这不再是由于相反的原因。那是(可能)因为您重定向到的页面包含一些错误(或者您提供的 URL 根本没有意义)。您可能不想通过硬编码slug?
    • 我建议您查看浏览器将您重定向到的位置,以及发生新错误的位置(使用debug=True 运行)。
    猜你喜欢
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 2018-11-18
    相关资源
    最近更新 更多