Django新手求助:URL参数接收与过滤时遭遇404页面未找到错误
嘿,我来帮你排查下问题!你遇到的404错误和过滤无效的问题,主要出在路由配置和参数获取方式上,咱们一步步来解决:
1. 为什么会出现404错误?
你用了path()函数配置路由,但里面写了正则表达式语法——path()并不支持正则,它只识别路径转换器(比如<str:xxx>)。所以你的路由规则path('model_number/(?P<receipt_ballot>\w+)$', ...)会被当成字面量路径,自然匹配不上/model_number/001-000002/。
另外,你写的正则\w+只能匹配字母、数字和下划线,没法匹配参数里的横杠-,这也是潜在的匹配失败原因。
2. 修正路由配置
有两种简洁的方式解决路由问题:
方式一:用re_path()支持正则
把path()换成re_path()(Django专门支持正则路由的函数),同时修正正则表达式来匹配横杠:
# urls.py from django.urls import re_path re_path(r'^model_number/(?P<receipt_ballot>[\w-]+)/$', views.ModelNumber.as_view()),
这里[\w-]+表示匹配字母、数字、下划线和横杠,末尾的/$确保匹配带斜杠的路径。
方式二:用path()的路径转换器(更推荐)
如果你不想写正则,path()的<str:xxx>转换器可以匹配除了斜杠之外的所有字符,刚好符合你的参数需求:
# urls.py path('model_number/<str:receipt_ballot>/', views.ModelNumber.as_view()),
这种写法更清晰易懂,是Django推荐的路由写法。
3. 修正视图的参数获取逻辑
你现在的视图是从query_params(也就是URL里?value=xxx这种查询参数)拿值,但你的参数是放在路径里的(比如/model_number/001-000002/),所以应该从self.kwargs里获取命名的路径参数:
# views.py class ModelNumber(generics.ListAPIView): permission_classes = [IsAuthenticated, ] serializer_class = ModelSerializer def get_queryset(self): # 从路径参数中取出receipt_ballot的值 receipt_ballot = self.kwargs.get('receipt_ballot') if receipt_ballot: # 用拿到的值过滤Model的value字段 return Model.objects.filter(value=receipt_ballot) # 如果没有参数,返回所有数据(或者根据需求返回空/报错) return Model.objects.all()
4. 测试验证
现在重新启动服务,访问http://192.168.0.3:8080/model_number/001-000002/,应该就能正确匹配路由,并且返回value等于001-000002的Model实例了。
内容的提问来源于stack exchange,提问作者TonyOH

