Django报错:字段'id'期望数字却得到'create-room'求解决
问题解答:Field 'id' expected a number but got 'create-room'
错误原因
Django的URL路由是从上到下依次匹配的,你当前的urlpatterns里,path('room/<str:pk>/', ...)放在了path('create-room/', ...)前面。当访问/create-room/时,Django会把它匹配到room/<str:pk>/这条路由,将create-room作为pk参数传给room视图函数。而Room模型的id是整数类型,用字符串create-room查询自然会抛出类型不匹配的错误。
解决方法
调整URL路由顺序,把更具体的create-room路由移到room/<str:pk>/前面:
from . import views from django.urls import path urlpatterns = [ path('', views.home, name='home'), path('create-room/', views.createRoom, name='create-room'), # 调整到通用路由前 path('room/<str:pk>/', views.room, name='room'), ]
额外优化:Room的id是整数,可把路由里的<str:pk>改成<int:pk>,让Django自动校验参数类型,避免非数字参数进入room视图:
path('room/<int:pk>/', views.room, name='room'),
补充说明
- 路由匹配优先级由定义顺序决定,越具体的路由越要放在前面,防止被通用路由提前匹配。
- 使用
<int:pk>能在路由层面拦截非法请求,减少视图层的错误处理逻辑。
内容的提问来源于stack exchange,提问作者Nahi shady
相关产品推荐
相关产品推荐

