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

Django中如何让URL的slug路径支持Unicode字符?

Django中如何让URL的slug路径支持Unicode字符?

嗨,我刚碰到过类似的问题,Django默认的slug路径转换器确实只匹配ASCII字母、数字、连字符和下划线,没法处理Unicode字符。不过有两种靠谱的方法能解决这个问题,我给你详细讲讲:

方法一:自定义Unicode slug路径转换器

这是最规范的做法,你可以自己定义一个支持Unicode的转换器,之后在urls里复用它:

  1. 首先在你的Django应用目录下创建一个converters.py文件,写入以下代码:
from django.urls.converters import StringConverter

class UnicodeSlugConverter(StringConverter):
    # 这个正则会匹配Unicode字母、数字、连字符和下划线
    regex = r'[-\w\u00C0-\uFFFF]+'
  1. 然后在你的urls.py里注册这个转换器,并替换原来的slug为自定义的转换器名称:
from django.urls import path, register_converter
from . import views
from .converters import UnicodeSlugConverter

# 注册自定义转换器,命名为unicode_slug
register_converter(UnicodeSlugConverter, 'unicode_slug')

urlpatterns = [
    path('book/<unicode_slug:slug>/', views.view_book, name='book'),
    path('genres/', views.view_all_genres, name='genres'),
    path('genres/<unicode_slug:slug>/', views.preview_genre, name='preview_genre'),
]

方法二:直接使用正则路径(re_path)

如果你只是临时需要,不想新建转换器文件,可以用re_path代替path,直接写支持Unicode的正则表达式:

from django.urls import path, re_path
from . import views

urlpatterns = [
    re_path(r'^book/(?P<slug>[-\w\u00C0-\uFFFF]+)/$', views.view_book, name='book'),
    path('genres/', views.view_all_genres, name='genres'),
    re_path(r'^genres/(?P<slug>[-\w\u00C0-\uFFFF]+)/$', views.preview_genre, name='preview_genre'),
]

这里的正则[-\w\u00C0-\uFFFF]+会匹配包括Unicode字母在内的所有符合slug格式的字符,你可以根据自己的需求调整正则范围,比如如果需要支持更多特殊字符,就把它们加到正则里。

两种方法都能解决你的问题,推荐第一种,因为自定义转换器可以在整个项目里复用,更符合Django的最佳实践~

备注:内容来源于stack exchange,提问作者Ivaylo Kanchev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 16:54:31