Django新增路由后出现Field 'id' expected a number报错如何解决
错误原因
Django的路由匹配规则是从上到下顺序匹配,匹配到符合规则的路由就会停止向下查找,你的报错核心是urls.py的路由顺序和动态参数规则配置错误:
- 你将无前缀的动态参数路由
path('<category_id>', category, name='category')放在了login/logout/register等静态路由的前面,当你访问/logout、/logout_view或者浏览器自动请求/favicon.ico时,这些字符串会被直接捕获为category_id参数传给category视图 category视图中会将category_id作为数字主键查询分类表,传入字符串自然触发"Field 'id' expected a number"报错- 额外的访问错误:你的
logout路由的路径是/logout,logout_view是路由的name属性,你直接访问/logout_view路径不存在,自然也会被动态路由捕获。
解决方案
按如下步骤修改即可:
1. 调整路由顺序+添加动态参数类型限定
将所有静态路由放在动态路由前面,同时给数字类型的路径参数加int:类型限定,只有整数才会匹配该动态路由,修正后的urls.py代码如下:
from django.contrib import admin from django.urls import path from Artykuly.views import * urlpatterns = [ path('admin/', admin.site.urls), # 建议admin后面加斜杠,符合Django默认规范 path('', index, name='index'), path('artykul/<int:article_id>', article, name='article'), # 这里参数你实际是当文章ID用,建议改名避免混淆 path('login/', login_view, name='login_view'), path('register/', register_view, name='register_view'), path('logout/', logout_view, name='logout_view'), # 动态路由放到最后 path('<int:category_id>', category, name='category'), ]
2. 修正访问/跳转逻辑
访问登出地址请直接用/logout,如果是代码中跳转请用reverse('logout_view'),模板中请用{% url 'logout_view' %},不要直接访问/logout_view路径。
3. 可选:处理favicon.ico请求
如果不想看到favicon.ico的报错,可以在urlpatterns最前面加一行路由直接返回空响应或者指定图标:
from django.http import HttpResponse path('favicon.ico', lambda request: HttpResponse(status=204)),
额外优化建议
你当前的article视图逻辑存在参数混淆:artykul/<int:category_id>路径传入的参数,在视图中是作为文章主键查询的,建议将路径参数改为<int:article_id>,同步修改视图的入参名,避免后续逻辑混淆。
内容的提问来源于stack exchange,提问作者xMaster
相关产品推荐
相关产品推荐

