From d1d6dfa143a68ad0c16ba0aff4ab0aa93e74df48 Mon Sep 17 00:00:00 2001 From: Junwei Zhao Date: Thu, 12 Feb 2026 10:43:56 +1100 Subject: [PATCH] Support unicode in url --- data/db.sqlite3 | Bin 479232 -> 479232 bytes links/models.py | 4 +--- links/tag_urls.py | 22 ++++++++++++++++++---- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/data/db.sqlite3 b/data/db.sqlite3 index 410840ad86333864e078ee14abecb437717cbc46..0c4948761b58713d83e7bd683f0a1f5929e31ee2 100644 GIT binary patch delta 160 zcmZozAltA&c7ilx@kAMC#^Q|$qWX*>&1L%A%k&xhE-(kPYENZnTFS(#z1h&9mPJV+ zgoVM8$;iOSOxM6r*U(bI(7?*r5Qy|lER77!jTokG_hn_;&cz(e`*u3J08=Lu@7wJY z1el_Er=Q=?!pbx?r2UI56A&{4F$)m0ZvP_7)@m(;WRkI&g|Vd}|Mu=kw$g6^EDA1G delta 119 zcmZozAltA&c7ilx;Y1l{#=?yWqWX-%&1L%A%k&xhE-(kN`c7qMTDsZLU?IzPUsk5= zT+BhdU#7DQFm-O9B)}BSJ28NB`uY7VtnEK#nShuXh*^M`b^A|Qwgzhk06v-~@&Et; diff --git a/links/models.py b/links/models.py index 7195a76..8f805a4 100644 --- a/links/models.py +++ b/links/models.py @@ -184,7 +184,7 @@ class Tag(models.Model): def save(self, *args, **kwargs): if not self.slug: - self.slug = slugify(self.name) + self.slug = slugify(self.name, allow_unicode=True) super().save(*args, **kwargs) class Page(models.Model): @@ -338,5 +338,3 @@ class Image(models.Model): height=height, fit='cover' ) - - diff --git a/links/tag_urls.py b/links/tag_urls.py index 7c33340..1aad773 100644 --- a/links/tag_urls.py +++ b/links/tag_urls.py @@ -1,10 +1,24 @@ -from django.urls import path +from django.urls import path, register_converter from . import tag_views + +class UnicodeSlugConverter: + """Path converter that accepts Unicode characters in slugs, including Chinese, Japanese, etc.""" + regex = r'[-\w]+' # \w includes Unicode word characters + + def to_python(self, value): + return value + + def to_url(self, value): + return value + + +register_converter(UnicodeSlugConverter, 'uslug') + urlpatterns = [ path('ui/tags/', tag_views.TagListView.as_view(), name='tag-list'), path('ui/tags/new/', tag_views.TagCreateView.as_view(), name='tag-create'), - path('ui/tags//', tag_views.TagDetailView.as_view(), name='tag-detail'), - path('ui/tags//edit/', tag_views.TagUpdateView.as_view(), name='tag-update'), - path('ui/tags//delete/', tag_views.TagDeleteView.as_view(), name='tag-delete'), + path('ui/tags//', tag_views.TagDetailView.as_view(), name='tag-detail'), + path('ui/tags//edit/', tag_views.TagUpdateView.as_view(), name='tag-update'), + path('ui/tags//delete/', tag_views.TagDeleteView.as_view(), name='tag-delete'), ]