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

能否用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 = True
  • WAGTAIL_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 03:35:08