0

我有以下看法:

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 配置:

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

带有“标签”的正则表达式允许 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/

任何见解表示赞赏,谢谢!

4

2 回答 2

1

Do you really need the forward slash on the end of the product page URL? A URL which ends with a forward slash is distinct from one which does not.

Just like delimiters are left at the end of a path to suggest a directory (with files underneath it) and left off at the end of file paths, so too could you leave the slash on for the tag sections but lop it off for individual products.

That gets around the problem entirely :-)

于 2012-08-27T07:20:20.320 回答
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 不友好,除非您想打扰重复的内容元标记
于 2012-08-27T07:03:15.067 回答