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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:57:55