访问带语言代码的URL时Django语言切换功能失效如何解决
问题根因
经过排查,你的配置存在3个可导致语言切换失效的问题:
- 模板语法错误:语言切换表单的
next隐藏字段属性写法错误,value后缺失等号=,导致切换语言时无法正确传递跳转路径 - 上下文参数缺失:模板中使用的
redirect_to变量需要你在渲染页面的视图中手动传入,未传值时该字段为空,切换后无法正常跳转 - URL路径匹配风险:
i18n路由未添加末尾斜杠,部分场景下会出现路径匹配失败
修复步骤
1. 修改语言切换模板代码
直接用request.path替代需要手动传递的redirect_to变量,同时修复语法错误,修改后的表单代码如下:
<form id="lang-switcher" action="{% url 'set_language' %}" method="post">{% csrf_token %} <input type="hidden" name="next" value="{{ request.path }}"> <select class="language_selector" name="language" onchange="this.form.submit()"> {% get_available_languages as LANGUAGES %} {% get_language_info_list for LANGUAGES as languages %} {% for language in languages %} <option value="{{ language.code }}" {% if language.code == LANGUAGE_CODE %} selected {% endif %}> {{ language.code }} </option> {% endfor %} </select> </form>
同时确认settings.py的模板上下文处理器中已添加django.template.context_processors.request,这样模板才能直接调用request变量:
TEMPLATES = [ { ... 'OPTIONS': { 'context_processors': [ ... 'django.template.context_processors.request', ... ], }, }, ]
2. 修复urls.py路由配置
给i18n路由添加末尾斜杠,避免路径匹配异常:
urlpatterns = [ path('i18n/', include('django.conf.urls.i18n')), path('admin/', admin.site.urls), ] urlpatterns += i18n_patterns( path('', include('base.urls')), prefix_default_language=True, )
验证效果
修改完成后重启服务,直接访问带语言前缀的链接(如domain.pt/en),切换语言时会自动跳转到对应语言前缀的同路径页面,分享链接打开后也可正常切换语言。
内容的提问来源于stack exchange,提问作者Luis Silva
相关产品推荐
相关产品推荐

