Django 1.11 URL翻译异常:solution路由返回404错误求助
解决Django 1.11 URL翻译中带slug的URL返回404的问题
我帮你定位到了问题的核心,也整理了对应的修复方案,一起来看看:
问题出在哪?
你定义solution URL时,犯了两个关键错误:
- 把正则锚点符号
^放进了翻译字符串:_(r'^solucoes')会让^成为翻译内容的一部分,当你把^solucoes翻译成英文solutions时,最终生成的正则会缺少开头的锚点,无法匹配根路径下的/solutions/xxx请求,直接导致404。 - 没用到
i18n_patterns:虽然你导入了它,但官方推荐用这个工具来管理国际化URL,它能自动处理语言前缀,也让URL翻译更规范。
修复方案
1. 分离正则元字符和翻译文本
只翻译URL里的实际文本部分(比如solucoes),把^、$这些正则专用符号放在翻译字符串外面。
2. 用i18n_patterns包裹所有需要翻译的URL
下面是修复后的完整urls.py代码:
from django.conf.urls import url # noqa from django.conf.urls.i18n import i18n_patterns from django.utils.translation import gettext_lazy as _ from core.views import HomeView, SolutionsView, SolutionView # 非国际化的URL可以放在这里,比如不需要翻译的接口 urlpatterns = [] # 所有需要翻译的URL都放到i18n_patterns里 urlpatterns += i18n_patterns( url(r'^$', HomeView.as_view(), name='home'), # 单独翻译路径文本,正则锚点放在外面 url(r'^{solutions}$'.format(solutions=_('solucoes')), SolutionsView.as_view(), name='solutions'), # 同样的方式处理带slug的URL url(r'^{solutions}/(?P<slug>[\w-]+)$'.format(solutions=_('solucoes')), SolutionView.as_view(), name='solution') )
最后别忘了这些步骤
- 更新你的翻译文件:确保po文件里的msgid是
solucoes(不带^),对应的目标语言翻译(比如英文)是solutions。 - 重新编译翻译:
python manage.py makemessages -l en # 替换成你的目标语言代码 python manage.py compilemessages - 测试时记得带上语言前缀,比如访问
/en/solutions/my-slug或者/pt/solucoes/my-slug,如果需要自动跳转默认语言,记得配置LocaleMiddleware和LANGUAGE_CODE。
这样修改后,你的solution URL应该就能正常工作啦!
内容的提问来源于stack exchange,提问作者Vanessa
相关产品推荐
相关产品推荐

