Django url模式 - 如何使slug url适用于多个视图

时间:2015-11-13 10:36:55

标签: django

我在一些网站上看到了一个网址模式,它们针对不同的对象(如类别和产品)显示相同的模式。

例如,当您使用平板电脑包和索尼相机时,您会看到与www.website/tablet-caseswww.website/sony-camera相同的模式。 如何在Django中执行此操作而不会出现如下错误。

Page not found (404)
Request Method: GET
Request URL:    http://127.0.0.1:8000/tablet-cases/
Raised by:  Product.views.category_detail_view

我的意思是,如何对类别和产品使用相同的模式,如下所示:

url(r'^(?P<slug>[\w-]+)/$', ProductDetailView.as_view(), name='product_detail'),
url(r'^(?P<slug>[\w-]+)/$', CategoryDetailView.as_view(), name='category_detail'),

1 个答案:

答案 0 :(得分:2)

Django匹配第一个正则表达式,在本例中是product_detail视图。默认情况下,Django没有办法依次尝试每个网址,因此永远不会使用您当前的网址调用类别视图。

最简单的解决方法是命名您的网址。这可能是一个好主意 - 目前,如果您有类别和具有相同slug的产品,您将遇到问题。

url(r'^products/(?P<slug>[\w-]+)/$', ProductDetailView.as_view(), name='product_detail'),
url(r'^categories/(?P<slug>[\w-]+)/$', CategoryDetailView.as_view(), name='category_detail'),

另一种选择是创建一个视图,比如product_or_category。在那里,你可以测试slug是否匹配一个类别或slug,然后继续。这样可行,但您可能会有一些重复的代码,它可能看起来不像您目前拥有的两个基于类的视图一样优雅。

url(r'^(?P<slug>[\w-]+)/$', product_or_category, name='product_or_category'),

最后,项目django-multiurl似乎可以满足您的需求。我从来没有使用它,所以我无法对它提出任何要求。

相关问题