Django urls.py 错误 - 某些模式无法工作
我在用Django开发个人博客的时候遇到了一个很麻烦的错误。简单来说,我修改了urls.py文件,添加了一些规则,让某些视图可以被访问。
urls.py
from django.conf.urls import include, url
from django.contrib import admin
from blog import views
urlpatterns = [
# Examples:
# url(r'^$', 'blogas.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),
url(r'^admin/', include(admin.site.urls)),
url(r'^$', views.index, name='index'),
url(r'^(?P<slug>\w+)', views.view_post, name='view_blog_post'),
url(r'^about/$', views.about, name='about'),
url(r'^posts/$', views.posts, name='posts'),
]
除了在尝试访问 http://127.0.0.1:8000/
的时候,或者访问/posts时,Django会报404错误,其他的都正常。这个错误的原因是什么呢?我已经定义了这两个规则,但系统似乎没有识别出这个模式——可能是我拼写错了什么?也可能是我对网址格式一无所知(可能是,因为这是我第一次做这种事情)?
非常感谢每一个能帮我找到这个错误的新手程序员 :)
2 个回答
5
这些网址模式是从上到下处理的。你的第三个模式 ^(?P<slug>\w+)
会把所有东西都匹配上,所以 about
和 posts
根本就无法被找到。
举个例子:Django 想要找到 about/
这个网址对应的视图。模式 ^admin/
和 ^$
都不匹配。但是 ^(?P<slug>\w+)
匹配成功了,因为 about
是以字母或数字开头的(这些字符都包含在 \w
中)。
>>> import re
>>> re.search('^(?P<slug>\w+)', 'about/')
<_sre.SRE_Match object at 0x10b5b7be8>
所以 Django 找到了匹配的规则,调用了 views.view_post
并完成了请求。这意味着,更具体的规则应该放在前面。更好的做法是:避免模糊不清的情况。
2
你需要改变这个位置:url(r'^(?P<slug>\w+)', views.view_post, name='view_blog_post'),
。
urlpatterns = [
# Examples:
# url(r'^$', 'blogas.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),
url(r'^admin/', include(admin.site.urls)),
url(r'^$', views.index, name='index'),
url(r'^about/$', views.about, name='about'),
url(r'^posts/$', views.posts, name='posts'),
url(r'^(?P<slug>\w+)', views.view_post, name='view_blog_post'),
]
urlpatterns 是一个列表,网址的顺序是很重要的。