Django 2.0使用正则表达式获取主键时出现404错误求助
解决Django 2.0中正则路由匹配404的问题
你的问题出在Django 2.0路由语法的变化上——path()函数并不支持直接写正则表达式,它是为简洁的路径转换器设计的,而正则路由需要用re_path()(或者兼容旧版的url())来实现。这就是为什么你的详情页路由一直匹配不上,返回404错误。
下面给你两种可行的修复方案:
方案一:使用Django路径转换器(推荐)
Django 2.0+的path()支持内置的路径转换器,比如<int:pk>可以直接匹配整数类型的主键,写法更简洁且易读:
修改你的urls.py:
from django.urls import path from . import views urlpatterns = [ path('', views.School_Lview.as_view(), name='list'), # 用<int:pk>替代正则表达式 path('<int:pk>/', views.School_Dview.as_view(), name='detail') ]
方案二:改用re_path()写正则路由
如果你坚持要用正则表达式捕获主键,需要把path()换成re_path(),记得要先导入它:
修改后的urls.py:
from django.urls import path, re_path # 导入re_path from . import views urlpatterns = [ path('', views.School_Lview.as_view(), name='list'), # 用re_path包裹正则表达式,注意r前缀表示原生字符串 re_path(r'(?P<pk>\d+)/', views.School_Dview.as_view(), name='detail') ]
额外优化:模板中使用反向解析(推荐)
你的模板里直接用{{school.id}}作为链接,虽然能工作,但更健壮的方式是用Django的URL反向解析,这样即使后续修改路由规则,模板链接也不会失效:
修改模板代码:
{% for school in schools %} <h2> <li><a href="{% url 'detail' pk=school.id %}">{{ school.name }}</a></li> </h2> {% endfor %}
这样调整后,你的详情页路由就能正确匹配主键,不会再返回404错误了。
内容的提问来源于stack exchange,提问作者AbrarWali
相关产品推荐
相关产品推荐

