【发布时间】:2020-05-28 20:09:18
【问题描述】:
好的,我有一个简单的设置,其中包含属于某些类别的页面。
在我的网址中有
path('<slug:category_slug>/', views.PageByCategoryView.as_view(), name='page_by_category'),
path('<slug:category_slug>/<slug:page_slug>/', views.PageDetailView.as_view(), name='page_detail'),
例如;
www.mywebsite.com/activities/cycling/
指向有关骑行的页面的正确详细视图。
现在我想如果我们可以缩短网址就好了;
www.mywebsite.com/cycling/
于是我写了如下视图;
def redirect_with_category(request, page_slug):
'''
This redirect view points to the canonical url
'''
page = get_object_or_404(Page, slug=page_slug)
return redirect(page, permanent=True)
urls.py是这样的;
path('<slug:category_slug>/', views.PageByCategoryView.as_view(), name='page_by_category'),
path('<slug:page_slug>/', views.redirect_with_category, name='page_detail_redirect'),
path('<slug:category_slug>/<slug:page_slug>/', views.PageDetailView.as_view(), name='page_detail'),
现在我们遇到了麻烦,即使重定向有效。如果找不到匹配项,Django 将停止尝试解决 category_slug。
为了让它工作,Django 应该尝试解析在 category_slug 中找不到匹配项的下一个路径。
根据文档,显然 Django 抛出了一个错误; "or if an exception is raised during any point in this process, Django invokes an appropriate error-handling view"
有没有办法解决这个问题?如果在第一个 url 中没有找到匹配的 slug,是否可以强制 Django 查找下一个匹配结果?
所以我想重定向;
www.mywebsite.com/cycling/ 至:www.mywebsite.com/activities/cycling/
【问题讨论】:
-
当然,因为任何 slug 都会匹配
<slug:category_slug>,因此第二个 url 永远不会“触发”。 -
我建议只使用单个
path('<slug:any_slug>/',[...],然后在视图中您可以使用try: except先查找类别,然后在未找到类别时查找页面。 -
本,这将是一个有效的选择。尽管出于 SEO 的目的,我想将类别保留在 url 中。