在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/
关于或/ post,否则一切似乎都在工作,Django会抛出404错误。这是什么原因?我已经定义了这两个规则,但系统似乎没有认识到这种模式 - 也许我已经误解了一些东西?也许我对网址格式一无所知(可能是,这是我第一次做这些事情)?
非常感谢新手程序员对发现错误的每个人:)
答案 0 :(得分:5)
url-patterns从上到下进行处理。您的第三种模式^(?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找到了一个匹配,callBs views.view_post
并完成了请求。这意味着,必须首先采用更具体的规则。更好:避免歧义。
答案 1 :(得分: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是列表,网址顺序很重要。