Django URL 通配符与反向?

dvt*_*tan 1 django django-urls

文档中,它说 URL 是从上到下测试的:

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

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

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

如何才能做到这一点?

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

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
]
Run Code Online (Sandbox Code Playgroud)

Ian*_*ice 6

一种方法是捕获所有其他 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'),
]
Run Code Online (Sandbox Code Playgroud)

视图.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'))
Run Code Online (Sandbox Code Playgroud)