能否用gettext_lazy翻译RoutablePageMixin页面子路径?访问翻译路径遇404
问题:Wagtail RoutablePage子路径翻译后访问404
我创建了一个继承RoutablePageMixin与TranslatedPage的页面,想要像Django的urlpatterns那样,用gettext_lazy根据当前激活语言翻译子路径,但访问翻译后的路径时始终出现404错误。想请教这是否可行,或是遗漏了必要配置?
页面定义代码:
class StudyBrowserPage(RoutablePageMixin, TranslatedPage): page_description = "Weiterleitung zum Studienbrowser" @path('') def list_studies(self, request): studies = Study.objects.all() return self.render(request, context_overrides={ 'studies': studies }) # 实际会有参数,这里简化示例 @path(_('studie') + '/') def study_detail_view(self, request): return self.render(request, template='wagtail_home/study_detail.html')
已在django.po中翻译字符串:
msgid "studie" msgstr "study"
访问.../studie/可正常打开,但.../study/无法访问。
已配置的必要设置:
- 模板上下文处理器包含
django.template.context_processors.i18n USE_I18N = TrueWAGTAIL_I18N_ENABLED = True- 已安装
wagtail-localize
解决方案
问题本质
RoutablePageMixin的@path装饰器是在类加载阶段静态注册路径的,而gettext_lazy的翻译逻辑要到请求处理的运行时才会生效。这就导致注册的路径始终是原语言的字符串(比如德语的studie/),翻译后的study/从未被注册为有效路径,因此访问时返回404。
具体解决方法
1. 重写get_subpage_urls动态生成语言适配路径
放弃@path装饰器,手动在get_subpage_urls方法中根据当前激活语言生成路径。该方法会在每次请求时被调用,此时gettext(注意用gettext而非gettext_lazy)会返回对应语言的翻译字符串,确保路径正确注册。
修改后的代码:
from django.utils.translation import gettext as _ from wagtail.contrib.routable_page.models import RoutablePageMixin, route class StudyBrowserPage(RoutablePageMixin, TranslatedPage): page_description = "Weiterleitung zum Studienbrowser" def get_subpage_urls(self): return [ # 列表页路径 route(r'^$', self.list_studies, name='list_studies'), # 根据当前语言动态生成详情页路径 route(r'^' + _('studie') + r'/$', self.study_detail_view, name='study_detail'), ] def list_studies(self, request): studies = Study.objects.all() return self.render(request, context_overrides={ 'studies': studies }) def study_detail_view(self, request): return self.render(request, template='wagtail_home/study_detail.html')
2. 完善语言前缀配置
确保项目URL配置中使用i18n_patterns包裹Wagtail的URL,让Django自动处理语言前缀(如/en/study/或/de/studie/),保证当前语言环境正确:
# urls.py from django.conf.urls.i18n import i18n_patterns from wagtail import urls as wagtail_urls urlpatterns = [ # 其他非国际化URL配置 ] + i18n_patterns( path('', include(wagtail_urls)), prefix_default_language=False, # 可选:默认语言不带前缀 )
3. 必要验证步骤
- 运行
django-admin compilemessages确保翻译文件已编译生效; - 确认语言切换功能正常,当前请求的语言环境与预期一致;
- 避免直接用
gettext_lazy作为路径参数,类加载阶段无法解析该对象,会导致无效路径注册。
内容的提问来源于stack exchange,提问作者user27369772
相关产品推荐
相关产品推荐

