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

Wagtail Localize多语言URL异常:第二语言路径被追加默认语言前缀致404

Wagtail Localize 出现异常URL结构问题

访问http://127.0.0.1:8000可正常跳转至英文首页http://127.0.0.1:8000/en/,符合预期;但尝试访问中文路径http://127.0.0.1:8000/cn/时,英文locale前缀「en」会被自动追加至路径前,形成http://127.0.0.1:8000/en/cn/或http://127.0.0.1:8000/en/cn/about/这类错误路径。
即使手动修正为预期的http://127.0.0.1:8000/cn/about/,「en」仍会被自动追加,导致页面返回404错误,点击后台的「实时预览(live view)」也会出现同样问题。

错误信息

页面未找到 (404)
请求方法: GET
请求URL:    http://127.0.0.1:8000/en/cn/
触发位置:  wagtail.views.serve
使用website.urls中定义的URLconf,Django按以下顺序尝试了这些URL模式:

en/ django-admin/
en/ admin/
en/ documents/
en/ search/ [name='search']
en/ _util/authenticate_with_password/<int:page_view_restriction_id>/<int:page_id>/ [name='wagtailcore_authenticate_with_password']
en/ _util/login/ [name='wagtailcore_login']
en/ ^((?:[\w-]+/)*)$ [name='wagtail_serve']
当前路径 en/cn/ 匹配了最后一个模式。

相关配置文件

urls.py

# 以下配置遵循官方文档

from django.conf import settings
from django.urls import include, path
from django.contrib import admin
from django.conf.urls.i18n import i18n_patterns

from wagtail.admin import urls as wagtailadmin_urls
from wagtail import urls as wagtail_urls
from wagtail.documents import urls as wagtaildocs_urls

from search import views as search_views

urlpatterns = [
    path("django-admin/", admin.site.urls),
    path("admin/", include(wagtailadmin_urls)),
    path("documents/", include(wagtaildocs_urls)),
]

urlpatterns += i18n_patterns(
    path('search/', search_views.search, name='search'),
    path("", include(wagtail_urls)),
    prefix_default_language=True,
)

if settings.DEBUG:
    from django.conf.urls.static import static
    from django.contrib.staticfiles.urls import staticfiles_urlpatterns

    # 开发服务器提供静态文件和媒体文件
    urlpatterns += staticfiles_urlpatterns()
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

base.py

# 应用定义
INSTALLED_APPS = [
    "home",
    "menus",
    "resources",
    "courses",
    "contact",
    "schedule",
    "search",

    "wagtail_localize",
    "wagtail_localize.locales",
    
    "wagtail.contrib.forms",
    "wagtail.contrib.redirects",
    "wagtail.embeds",
    "wagtail.sites",
    "wagtail.users",
    "wagtail.snippets",
    "wagtail.documents",
    "wagtail.images",
    "wagtail.search",
    "wagtail.admin",
    "wagtail",
    
    "modelcluster",
    "taggit",
    
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "django_extensions",
]

MIDDLEWARE = [
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
    "django.middleware.security.SecurityMiddleware",
    # 检测用户浏览器语言并跳转到最合适的语言版本
    "django.middleware.locale.LocaleMiddleware",
    "wagtail.contrib.redirects.middleware.RedirectMiddleware",
]

ROOT_URLCONF = "website.urls"

TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [
            os.path.join(PROJECT_DIR, "templates"),
        ],
        "APP_DIRS": True,
        "OPTIONS": {
            "context_processors": [
                "django.template.context_processors.debug",
                "django.template.context_processors.request",
                "django.contrib.auth.context_processors.auth",
                "django.contrib.messages.context_processors.messages",
            ],
        },
    },
]

WSGI_APPLICATION = "website.wsgi.application"

# 数据库
# https://docs.djangoproject.com/en/4.1/ref/settings/#databases

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": os.path.join(BASE_DIR, "db.sqlite3"),
    }
}

# 密码验证
# https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
    },
    {
        "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
    },
    {
        "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
    },
    {
        "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
    },
]

# 国际化配置
# https://docs.djangoproject.com/en/4.1/topics/i18n/

LANGUAGE_CODE = "en"
TIME_ZONE = "UTC"

# 开启Django和Wagtail的国际化支持
USE_I18N = True

# 按用户本地格式显示日期和数字
USE_L10N = True

WAGTAIL_I18N_ENABLED = True

USE_TZ = True

WAGTAIL_CONTENT_LANGUAGES = LANGUAGES = [
    ('en', "英语(英国)"),
    ('cn', "中文"),
]

WAGTAILLOCALIZE_SYNC_LIVE_STATUS_ON_TRANSLATE = False

# 静态文件(CSS、JavaScript、图片)
# https://docs.djangoproject.com/en/4.1/howto/static-files/

STATICFILES_FINDERS = [
    "django.contrib.staticfiles.finders.FileSystemFinder",
    "django.contrib.staticfiles.finders.AppDirectoriesFinder",
]

STATICFILES_DIRS = [
    os.path.join(PROJECT_DIR, "static"),
]

# 生产环境推荐使用ManifestStaticFilesStorage,避免缓存中提供过时的JavaScript/CSS资源(例如Wagtail升级后)
# 参考:https://docs.djangoproject.com/en/4.1/ref/contrib/staticfiles/#manifeststaticfilesstorage

STATICFILES_STORAGE = "django.contrib.staticfiles.storage.ManifestStaticFilesStorage"

STATIC_ROOT = os.path.join(BASE_DIR, "static")
STATIC_URL = "/static/"

MEDIA_ROOT = os.path.join(BASE_DIR, "media")
MEDIA_URL = "/media/"

# Wagtail配置

WAGTAIL_SITE_NAME = "website"

# 搜索配置
# https://docs.wagtail.org/en/stable/topics/search/backends.html

WAGTAILSEARCH_BACKENDS = {
    "default": {
        "BACKEND": "wagtail.search.backends.database",
    }
}

# Wagtail管理后台中用于引用完整URL的基础URL(例如通知邮件中)
# 不要包含'/admin'或末尾斜杠

WAGTAILADMIN_BASE_URL = "http://example.com"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 17:18:09