如何从django urlconf中的正则表达式“打破”

时间:2012-08-27 00:47:05

标签: regex django django-views urlconf

我有以下观点:

def tag_page(request, tag):

    products = Product.objects.filter(tag=tag)

    return render(request, 'shop/tag_page.html', {'products': products, 'tag': tag})


def product_page(request, slug):

    product = Product.objects.get(slug=slug)

    return render(request, 'shop/product_page.html', {'product': product})

以及以下网址配置:

url(r'^(?P<tag>.+)/$', 'tag_page'),
url(r'^(?P<tag>.+)/(?P<slug>[-\w]+)/$', 'product_page'),

其中包含“tag”的正则表达式允许url路径随意增长,同时循环重定向到tag_page视图。

这让我有url:/ mens / shirts / buttonups /,其中路径的所有部分(/ mens,/ mens / shirts,/ mens / shirts / buttonups /)都指向tag_page视图,这是所需的

我想在某些时候结束这种行为,然后直接转到product_page视图,我尝试用它完成:

url(r'^(?P<tag>.+)/(?P<slug>[-\w]+)/$', 'product_page'),

当我关注product_page链接时:

<a href="{{ product.slug }}">{{ product }}</a>

我被定向到tag_pag视图。大概是因为slug url匹配标签正则表达式。

所以问题:有没有办法可以保持灵活的标记正则表达式重定向行为,但是一旦我到达产品页面就会“破坏”它?需要注意的一件重要事情是,我希望将产品页面保留在构建的url方案中,例如:mens / shirts / buttonups / shirt-product /

感谢任何见解,谢谢!

2 个答案:

答案 0 :(得分:1)

您是否真的需要产品页面网址末尾的正斜杠?以正斜杠结尾的URL与不具有正斜杠的URL不同。

就像分隔符留在路径的末尾以建议目录(在其下面有文件)并在文件路径的末尾留下,所以你也可以为标签部分留下斜线但是将其丢掉个别产品。

完全解决问题: - )

答案 1 :(得分:0)

我认为你不能只用urlconf-。*总是匹配所有东西。 我会这样做:

url(r'^(?P<path>.+)/$', 'path_page'),

def path_page(request,path):
    tags,unknown = path.rsplit('/',1)
    try:
        product = Product.objects.get(slug=unknown)
        return some_view_function(request,path,product)
    except Product.DoesNotExist:
        return some_another_view_function(request,path)

但是 - 我在这里看到一些问题:

  • 如果标签与产品的slug同名,该怎么办?
  • 除非您想使用重复的内容元标记
  • ,否则您的解决方案对SEO不友好