有一个功能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"),
答案 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)
但是请注意,如果product
为None
,则上述方法当然会失败,因为None
没有get_absolute_url
方法。