Django使用含Unicode字符的SlugField出现NoReverseMatch错误求助
问题根源
你遇到的报错是因为Django默认的<slug:slug>路由转换器仅匹配ASCII范围内的字符(字母、数字、横杠、下划线),而你生成的slug包含é这类Unicode字符,不在默认正则匹配范围内,因此反向解析路由失败。
解决方案
有两种可选方案,你可以根据业务需求选择:
方案一:保留slug中的Unicode字符
如果业务需要保留特殊字符在slug中,需要自定义支持Unicode的路由转换器:
- 在
masterdat应用目录下新建converters.py,写入以下内容:
from django.urls.converters import SlugConverter class UnicodeSlugConverter(SlugConverter): # 正则可根据你的业务需要补充其他语言的Unicode范围 regex = r'[-a-zA-Z0-9_\u00C0-\u00FF\u4e00-\u9fa5]+'
上述正则已覆盖西欧特殊字符和中文字符的匹配范围。
2. 在项目根路由文件(全局urls.py)中注册自定义转换器:
from django.urls import path, register_converter from masterdat.converters import UnicodeSlugConverter register_converter(UnicodeSlugConverter, 'uslug')
- 修改原有业务路由配置,将
<slug:slug>替换为自定义的<uslug:slug>:
path('countrycode/<uslug:slug>/', CountrycodeUpdateView.as_view(), name='countrycode_update'),
方案二:slug转ASCII字符(更通用的方案)
绝大多数场景下slug不需要保留原始Unicode字符,你可以直接修改slug生成逻辑,去掉allow_unicode=True参数,slugify方法会自动将é这类特殊字符转成对应ASCII字符,比如corée会转为coree,完全匹配默认slug转换器的规则:
修改CountrycodeCreateView的form_valid方法:
def form_valid(self, form): # 去掉allow_unicode=True参数 form.instance.slug = slugify(form.instance.cou_code) form.instance.cou_creator = self.request.user form.instance.cou_modifier = self.request.user # 注意你原有代码这里少了括号,是语法错误,需要补上 form.save() return super().form_valid(form)
同时可以将模型中SlugField的allow_unicode=True也去掉,保持逻辑一致。
额外注意点
你现有代码中form.save没有加括号,属于语法错误,虽然本次报错不是该原因导致,但后续操作会触发数据不保存的问题,建议一并修复。
内容的提问来源于stack exchange,提问作者deepdiver
相关产品推荐
相关产品推荐

