Django中传递字符串类型ID至URL的问题及求助
问题解决:Django主键含斜杠导致URL反向解析失败
问题根源
Django默认的str路径转换器(<str:qcp_id>)只会匹配**不含斜杠/**的字符串,而你的主键值是QCP/0001,包含斜杠,导致反向解析时无法匹配路由规则,触发找不到路径的错误。
解决方案
方案1:使用正则路由匹配含斜杠的主键
将原path路由替换为re_path,用正则表达式匹配包含斜杠的主键:
from django.urls import re_path # 通用匹配(可匹配任意含斜杠的字符串) re_path(r'^Quality/QualityControlPoint/(?P<qcp_id>.*)$', views.QualityControlPointView.as_view(), name='quality_control_point_view') # 精确匹配(针对你示例的QCP/数字格式,更安全) re_path(r'^Quality/QualityControlPoint/(QCP/\d+)$', views.QualityControlPointView.as_view(), name='quality_control_point_view')
- 必须给路由添加
name='quality_control_point_view',确保模板中的{% url %}能正确反向解析。
方案2:对主键进行URL编码/解码
如果不想修改路由规则,可通过编码主键中的斜杠来适配原str转换器:
- 模板修改:使用
urlencode过滤器编码主键:
<tr onclick="location.href='{% url 'quality_control_point_view' object.id|urlencode %}'">
- 视图解码:在视图中对获取到的
qcp_id解码,还原原始主键:
from urllib.parse import unquote from django.views.generic import DetailView class QualityControlPointView(DetailView): model = QualityControlPoint def get_object(self): # 解码URL编码后的主键 qcp_id = unquote(self.kwargs['qcp_id']) return self.model.objects.get(id=qcp_id)
额外检查
确认你的AllQualityControlPointView中传递给模板的object(或上下文变量)确实包含正确的主键值QCP/0001,避免因变量传递错误导致的问题。
内容的提问来源于stack exchange,提问作者Abdullah Sokrab
相关产品推荐
相关产品推荐

