Django配置重复URL前缀后使用url标签跳转报404错误如何解决
问题原因
你遇到的404错误由3个核心问题共同导致:
- 项目级路由重复定义
post/前缀,Django优先匹配第一个无include的路由,导致post应用下的所有子路由完全不生效 - post应用内的详情路由写法不符合Django path规则,且未添加末尾斜杠,和你期望的访问路径不匹配
- 模板中
url标签语法错误,且没有传递必填的id参数
修复步骤
1. 修正项目级urls.py
删除重复的post/普通路由,保留include导入应用路由,修改后代码如下:
urlpatterns = [ path('admin/', admin.site.urls , name = 'admin'), path('',homeView, name='home'), path('post/',include('post.urls'), name='posturl'), path('student/',include('student.urls') , name='studenturl'), ]
2. 修正post应用的urls.py
把原来项目级里定义的post视图移到应用路由的根路径,同时修正详情路由的写法,所有路径末尾统一加斜杠匹配Django默认规则:
urlpatterns = [ path('', post, name='post'), path('index/', post_index, name = 'index'), path('details/<int:id>/', post_detail, name = 'detail'), path('create/', post_create, name = 'create'), path('update/', post_update , name = 'update'), path('delete/', post_delete , name = 'delete'), ]
注意:如果你的post应用urls.py中设置了
app_name = 'post'的命名空间,后续模板调用路由时需要加上命名空间前缀。
3. 修正模板中的url标签写法
- 去掉
{%和%}内部的多余空格,否则Django无法识别模板标签 - 给
detail路由传入必填的id参数
正确写法如下:
<!-- 没有设置app_name的情况 --> <a href="{% url 'detail' post.id %}"> =>> {{post.id}}</a> <!-- 如果设置了app_name='post'的情况 --> <a href="{% url 'post:detail' post.id %}"> =>> {{post.id}}</a>
修改完成后重启Django开发服务器,即可正常访问:8000/post/details/5格式的地址。
内容的提问来源于stack exchange,提问作者mbulucay
相关产品推荐
相关产品推荐

