Django URL通配符反向?

时间:2016-02-23 17:53:30

标签: django django-urls

docs中,它表示网址是从上到下进行测试的:

  

/ articles / 2003 /将匹配列表中的第一个模式,而不是第二个模式,因为模式按顺序进行测试,第一个模式是第一个要通过的测试。随意利用订单插入这样的特殊情况。这里,Django会调用函数views.special_case_2003(request)

但是根据我的经验,这并没有发生 - 我希望最后一个URL是一个通配符,以匹配任何其他规则未捕获的内容,但此规则最终会捕获所有内容。我试过把它放在顶部和底部。

以下是要求:   - 未被其他规则捕获的任何内容都应与home匹配。   - home的反向应与最短接受的网址匹配,在这种情况下,它将为空白。

如何实现这一目标?

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^api/', include('project.api')),
    url(r'^', include('places.urls')),
]

places.urls

app_name = 'places'
urlpatterns = [
    url(r'^([0-9]+)/$', TemplateView.as_view(template_name=app_name + '/detail.html'), name='detail'),
    url(r'^', TemplateView.as_view(template_name=app_name + '/home.html'), name='home'), # Single page app
]

1 个答案:

答案 0 :(得分:2)

这样做的一种方法是捕获所有其他URL并重定向到home的url,这将为home保留一致的urlconf。代码如下所示,但如果您希望其他网址没有重定向直接转到主页,只需更改下面url中最终urlpatterns引用的视图。

<强> urls.py

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^api/', include('project.api')),
    url(r'^', include('places.urls')),
    # catch all other urls
    url(r'^.*/$', views.redirect_to_home,name='redirect-to-home'),
]

<强> views.py

from django.shortcuts import redirect
from django.core.urlresolvers import reverse_lazy

def redirect_to_home(request):
    # assuming home has an urlconf name of 'home'
    return redirect(reverse_lazy('home'))