Django中TypeError:get()缺少必填位置参数'id'的问题排查
解决Django中
get() missing 1 required positional argument: 'id'的问题 嘿,我一眼就看出问题出在你的URL配置上了!Django的path()函数不支持正则表达式语法,你现在用的r'^api/(?P<id>\d+)$'这种正则写法,path()会把它当作普通的字符串路径来匹配,根本不会解析里面的(?P<id>\d+)分组,这就导致视图里的get()方法始终拿不到id参数,自然抛出那个TypeError了。
下面给你两种靠谱的解决办法:
方法1:用re_path()替代path()处理正则路径
re_path()是Django专门用来处理正则表达式路径的工具(和旧版本的url()是同一个东西)。修改你的urls.py如下:
from django.contrib import admin from django.urls import path, re_path # 别忘了导入re_path from withoutrest import views urlpatterns = [ path('admin/', admin.site.urls), re_path(r'^api/(?P<id>\d+)/$', views.EmployeeDetails.as_view()), # 用re_path解析正则,末尾加/和你的测试请求对应 ]
方法2:用path()的内置路径转换器(更简洁)
Django的path()支持多种内置路径转换器,比如<int:id>可以直接匹配整数类型的id,写法比正则清爽太多:
from django.contrib import admin from django.urls import path from withoutrest import views urlpatterns = [ path('admin/', admin.site.urls), path('api/<int:id>/', views.EmployeeDetails.as_view()), # int转换器自动匹配整数id ]
另外还要提一句:你的测试代码test.py里请求的是BASE_URL + ENDPOINT + id + '/'(比如http://127.0.0.1:8000/api/1/),所以URL配置里要确保路径末尾带/,保持请求和路由的一致性哦。
最后小建议:模型类名employee改成Employee更符合Python的PEP8规范,虽然这不是当前错误的原因,但好习惯值得养成😊
内容的提问来源于stack exchange,提问作者Sibasankar Panigrahi
相关产品推荐
相关产品推荐

