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

Django使用阿拉伯语Slug访问URL出现404错误排查

Django阿拉伯语Slug访问404问题排查与解决

问题根源

你使用的URL正则表达式[\w_-]+存在限制:Python正则里的\w仅匹配ASCII范围内的字母、数字和下划线,阿拉伯语字符不在这个范围内,导致URL中的阿拉伯语slug无法被正确捕获。视图接收到的slug参数不完整或为空,自然查不到对应数据库记录,返回404错误。

修复方案

有两种简单有效的解决方式:

1. 改用Django的path语法(推荐)

Django的path内置支持Unicode字符,无需复杂正则。修改course应用的urls.py:

from django.urls import path
from django.contrib.sitemaps import GenericSitemap 
from .models import Course
from django.contrib.sitemaps.views import sitemap 
from .views import *

app_name = 'course'

info_dict = {
    'queryset': Course.objects.all(),
}

urlpatterns = [
    # 替换re_path为path,使用内置的Unicode兼容slug转换器
    path('detail/<slug:slug>/', detail_course, name='detail_courses'),
    path('sitemap.xml', sitemap, {'sitemaps': {'blog': GenericSitemap(info_dict, priority=0.6)}}, name='django.contrib.sitemaps.views.sitemap'),
]

<slug:slug>是Django内置的转换器,默认支持Unicode字符,能完美匹配阿拉伯语slug。

2. 修改正则表达式支持Unicode

如果坚持用re_path,可以调整正则规则来覆盖阿拉伯语字符:

# 方式一:指定阿拉伯语Unicode范围(精准匹配)
re_path(r'detail/(?P<slug>[\w\u0600-\u06FF_-]+)/$', detail_course, name='detail_courses'),

# 方式二:通用匹配(适合多语言场景,匹配除空格和斜杠外的所有字符)
re_path(r'detail/(?P<slug>[^\s/]+)/$', detail_course, name='detail_courses'),

额外验证点

确认你的Course模型中,slug字段开启了Unicode支持:

class Course(models.Model):
    # 其他字段...
    slug = models.SlugField(max_length=255, allow_unicode=True)

只有设置allow_unicode=True,SlugField才能正确存储阿拉伯语等非ASCII字符。

内容的提问来源于stack exchange,提问作者Alireza javanpour

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:25:34