跟随YouTube新手教程学习Django时遇到URL匹配不一致的404错误
你遇到的404问题主要来自两个关键细节:URL配置的拼接错误,以及访问路径和配置路径的格式不统一。我们一步步来解决:
1. 先看错误信息里的核心问题
从你提供的404提示可以看到,Django识别的URL pattern是products/ new(注意products/和new之间有空格),但你实际访问的是products/new/(没有空格且带结尾斜杠)——这说明你的主URL配置(pyshop.urls)没有正确引入products app的URL规则,导致拼接出了带空格的无效pattern。
2. 修正主URL配置(pyshop/urls.py)
你需要使用Django的include方法来正确引入products app的URL,而不是手动拼接路径。修改后的主urls.py应该是这样:
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), # 正确引入products app的URL配置,自动拼接路径 path('products/', include('products.urls')), ]
这样products app里的所有URL都会自动拼接在products/后面,不会出现莫名其妙的空格。
3. 统一访问路径和URL配置的格式
Django的path是精确匹配的:你访问的是带结尾斜杠的products/new/,但你的app urls里配置的是path('new', views.new)(不带斜杠)。虽然Django默认APPEND_SLASH=True会自动处理重定向,但为了避免混淆,建议统一格式:
修改products/urls.py,给path加上结尾斜杠,和访问路径保持一致:
from django.urls import path from . import views urlpatterns = [ path('', views.index), path('salt/', views.trending), # 对应/products/salt/ path('new/', views.new), # 对应/products/new/ ]
如果你更习惯不带斜杠的访问,也可以把访问路径改成products/new,同时保持配置里的path('new', views.new)不变。
4. 验证视图和URL的对应关系
注意到你把views.trending绑定到了salt路径,这应该是你测试时的临时修改,后续记得调整回合理的对应关系(比如salt对应专属的salt视图,trending对应trending路径),避免自己混淆。
最后一步
重启Django开发服务器,再次访问http://127.0.0.1:8000/products/new/,应该就能正常显示“New Products”了。
备注:内容来源于stack exchange,提问作者J. Toney

