You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django新增路由后出现Field 'id' expected a number报错如何解决

错误原因

Django的路由匹配规则是从上到下顺序匹配,匹配到符合规则的路由就会停止向下查找,你的报错核心是urls.py的路由顺序和动态参数规则配置错误:

  1. 你将无前缀的动态参数路由 path('<category_id>', category, name='category') 放在了 login/logout/register 等静态路由的前面,当你访问 /logout、/logout_view 或者浏览器自动请求 /favicon.ico 时,这些字符串会被直接捕获为category_id参数传给category视图
  2. category视图中会将category_id作为数字主键查询分类表,传入字符串自然触发"Field 'id' expected a number"报错
  3. 额外的访问错误:你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 05:54:04