Django语言切换表单仅默认语言首页生效 其余页面切换失败排查
问题原因
Django内置的set_language视图完成语言切换后,需要明确指定跳转路径。你当前的表单没有传递next参数,视图会默认读取HTTP请求头的Referer字段进行跳转,在非首页路径下会出现语言前缀替换失败的问题,最终跳转回原语言的路径,表现为切换没有生效。
修复步骤
修改语言切换表单,添加next隐藏字段
你需要在表单中显式传入当前页面的路径,让set_language可以正确生成对应语言的目标跳转路径,修改后的表单代码如下:{% get_current_language as lang_code %} {% get_available_languages as languages %} {% get_language_info_list for languages as langs %} <form action="{% url 'set_language' %}" method="POST"> {% csrf_token %} <!-- 新增next隐藏字段,传入当前页面路径 --> <input type="hidden" name="next" value="{{ request.path }}"> <select name="language" title="{% translate 'Language' %}"> {% for lang in langs %} <option value="{{ lang.code }}"{% if lang.code == lang_code %} selected{% endif %}> {{ lang.name_local }} ({{ lang.name_translated }}) </option> {% endfor %} </select> <input type="submit" value="OK" /> </form>如果你的页面路径需要保留查询参数,可以把
{{ request.path }}替换为{{ request.get_full_path }}。确认模板上下文已注入request对象
检查settings.py中TEMPLATES配置项,确保OPTIONS.context_processors列表包含django.template.context_processors.request,否则模板无法获取request变量,会导致next参数为空。示例配置如下:TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], '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', ], }, }, ]
配置校验
你现有的其他配置是正确的:
LocaleMiddleware放在SessionMiddleware之后、CommonMiddleware之前,符合官方要求的顺序set_language路由放在非i18n_patterns包裹的普通路由中,避免路径带语言前缀导致匹配失败prefix_default_language=False的配置不会影响语言切换逻辑
内容的提问来源于stack exchange,提问作者Danijela Popović
相关产品推荐
相关产品推荐

