Django动态生成语言列表时,移动端无法正确添加active类求助
Django动态生成语言选择列表时active类不生效问题
问题现象
从settings.LANGUAGES数组动态生成语言选择列表时,移动端无法为当前语言的链接添加active类;但静态写死的语言链接代码可正常生效。
静态生效代码示例
<a href="#" id="language-en" class="pure-drawer-link{% if LANGUAGE_CODE == 'en' %} active{% endif %}"> EN </a>
动态代码无法生效示例
{% for lng in settings.LANGUAGES %} {% if not lng.0 == "ru" %} <a href="#" id="language-{{ lng.0 }}" class="pure-drawer-link{% if LANGUAGE_CODE == '{{ lng.0 }}' %} active{% endif %}"> {{ lng.0|upper }} </a> {% if LANGUAGE_CODE == '{{ lng.0 }}' %} active {% else %} nonactive{% endif %} => 这里永远返回nonactive {% endif %} {% endfor %}
配置信息
中间件配置
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'my_app.middleware.ExpirationMiddleware', 'my_app.middleware.IPMiddleware', 'my_app.middleware.TranslationMiddleware', ]
国际化配置
USE_I18N = True USE_L10N = False USE_TZ = True TIME_ZONE = 'Europe/Zurich' LANGUAGE_CODE = 'en-US'
问题原因及解决方法
核心问题
动态代码的判断条件里错误地将变量用{{ }}包裹:{% if LANGUAGE_CODE == '{{ lng.0 }}' %}。模板语法中,{% %}标签内部直接使用变量名即可,无需嵌套{{ }},否则实际是在比较LANGUAGE_CODE与字符串'{{ lng.0 }}',永远无法匹配,因此无法添加active类。
修正后的动态代码
{% for lng in settings.LANGUAGES %} {% if not lng.0 == "ru" %} <a href="#" id="language-{{ lng.0 }}" class="pure-drawer-link{% if LANGUAGE_CODE == lng.0 %} active{% endif %}"> {{ lng.0|upper }} </a> {% if LANGUAGE_CODE == lng.0 %} active {% else %} nonactive{% endif %} {% endif %} {% endfor %}
额外检查点
- 确认自定义的
TranslationMiddleware能正确设置request.LANGUAGE_CODE,且该值可传递到模板中作为LANGUAGE_CODE变量使用。 - 检查
settings.LANGUAGES的格式是否正确,每个元素应为二元组(如('en', 'English')),确保lng.0能正确获取语言代码。
内容的提问来源于stack exchange,提问作者vladimir
相关产品推荐
相关产品推荐

