我在一些网站上看到了一个网址模式,它们针对不同的对象(如类别和产品)显示相同的模式。
例如,当您使用平板电脑包和索尼相机时,您会看到与www.website/tablet-cases
和www.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'),
答案 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似乎可以满足您的需求。我从来没有使用它,所以我无法对它提出任何要求。