【问题标题】:how to "break" from a regex in django urlconf如何从 django urlconf 中的正则表达式中“破解”
【发布时间】:2012-08-21 12:54:18
【问题描述】:

我有以下看法:

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'),

其中包含“标签”的正则表达式允许 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/

感谢任何见解,谢谢!

【问题讨论】:

    标签: regex django django-views urlconf


    【解决方案1】:

    我认为你不能只使用 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 不友好

    【讨论】:

      【解决方案2】:

      您真的需要产品页面 URL 末尾的正斜杠吗?以正斜杠结尾的 URL 与不以斜杠结尾的 URL 不同。

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

      这完全解决了问题:-)

      【讨论】:

      • 简单而正是我想要的。谢谢!
      猜你喜欢
      • 2011-03-06
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-30
      • 1970-01-01
      • 2013-05-04
      • 1970-01-01
      相关资源
      最近更新 更多