Django 2.0含Unicode的Slug URL无法匹配问题求助
解决Django 2.0中Unicode字符Slug URL无法匹配的问题
嘿,这个问题我刚好踩过坑!Django 2.0里的path()路由默认的slug转换器其实不支持Unicode字符,哪怕你在模型的SlugField里加了allow_unicode=True也没用——因为路由层和模型层的处理是分开的。下面是具体的解决方案:
1. 自定义支持Unicode的Slug转换器
默认的slug转换器使用的正则表达式是[a-zA-Z0-9_-]+,完全不包含Unicode字符。我们需要自己定义一个支持Unicode的转换器:
在你的urls.py中添加以下代码:
from django.urls import path, register_converter from django.urls.converters import StringConverter # 自定义支持Unicode的slug转换器 class UnicodeSlugConverter(StringConverter): # 正则覆盖大部分常用Unicode字符,可根据需求调整范围 regex = r'[-\w\u00C0-\uFFFF]+' # 注册转换器,命名为unicode_slug register_converter(UnicodeSlugConverter, 'unicode_slug')
然后修改你的路由配置,把原来的<slug:level_slug>换成<unicode_slug:level_slug>:
urlpatterns = [ path('', views.index, name='index'), path('level/<unicode_slug:level_slug>', views.level, name='level') ]
2. 确保Slug生成正确(关键步骤)
除了路由层的支持,还要保证你生成的slug是正确的Unicode格式。当你创建或更新Level实例时,使用slugify函数要带上allow_unicode=True参数:
from django.utils.text import slugify # 示例:生成包含Unicode的slug level_name = "deuxième" slug = slugify(level_name, allow_unicode=True) # 得到"deuxième"
如果生成slug时没加这个参数,得到的会是deuxieme(去掉了重音字符),这也会导致路由匹配不上。
3. 测试验证
完成上面两步后,重启你的Django开发服务器,再访问http://127.0.0.1:8000/game/level/deuxième,应该就能正常匹配到views.level视图了!
内容的提问来源于stack exchange,提问作者nabil london
相关产品推荐
相关产品推荐

