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

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定义,有两种可行方式:

  1. 推荐:使用原始字符串,无需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)
    
  2. 若必须用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:10:29