Django自定义URL转换器匹配失败:pk无法匹配正则表达式问题排查
问题分析与解决
问题现象
使用自定义URL转换器进行反向解析时出现错误:
Reverse for 'user-update' with keyword arguments '{'pk': 'Rwdr4l3D'}' not found. 1 pattern(s) tried: ['users/(?P<pk>[a-zA-Z0-9](8,))/update/\\Z']
问题根源
错误提示里的正则表达式[a-zA-Z0-9](8,)存在语法错误——重复限定符应该是{8,}(匹配8次及以上),但实际变成了(8,),这是因为你在定义HashIdConverter的regex时误用了f-string:
# 错误写法 regex = f'[a-zA-Z0-9]{8,}'
f-string会把{8,}当成占位符处理,最终生成的正则不符合预期,导致无法匹配你的8位哈希ID(如Rwdr4l3D)。
解决方案
修改utils/url.py中的regex定义,有两种可行方式:
推荐:使用原始字符串,无需f-string
因为这里不需要插入变量,直接用原始字符串定义正则即可:class HashIdConverter: regex = r'[a-zA-Z0-9]{8,}' def to_python(self, value): return h_decode(value) def to_url(self, value): return h_encode(value)若必须用f-string,转义大括号
在f-string中,要输出大括号需要用双大括号包裹:class HashIdConverter: regex = f'[a-zA-Z0-9]{{8,}}' def to_python(self, value): return h_decode(value) def to_url(self, value): return h_encode(value)
修复后,正则表达式会变成正确的[a-zA-Z0-9]{8,},就能匹配你的哈希ID,模板里的两种调用方式都会正常工作。
内容的提问来源于stack exchange,提问作者Dante
相关产品推荐
相关产品推荐

