Django urls.py 错误 - 某些模式无法工作

1 投票
2 回答
1139 浏览
提问于 2025-04-18 06:53

我在用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+) 会把所有东西都匹配上,所以 aboutposts 根本就无法被找到。

举个例子: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 是一个列表,网址的顺序是很重要的。

撰写回答