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

Django 1.11实现法语仅对管理员开放,普通用户限访问英语

解决Django 1.11中限制法语版本仅对管理员开放的问题

你之前在settings.py里直接导入User模型的思路踩了个典型的Django配置坑——因为Django启动时会优先加载settings.py,这时候ORM框架还没完成初始化,直接导入模型会触发配置完整性检查,进而导致SECRET_KEY相关的错误。这种用户状态判断的逻辑绝对不能放在全局配置里,得换个思路来实现需求。

下面是一套可行的分步方案:

1. 保留全局LANGUAGES基础配置

先维持settings.py里的LANGUAGES配置不变,Django的国际化功能需要全局知晓支持的语言列表:

LANGUAGES = (
    ('en', _('English')),
    ('fr', _('French')),
)
# 确保国际化相关开关开启
USE_I18N = True
USE_L10N = True
# 配置翻译文件存放路径(如果还没加的话)
LOCALE_PATHS = [
    os.path.join(BASE_DIR, 'locale'),
]

2. 自定义中间件拦截非管理员的法语请求

创建一个中间件,专门检查用户访问的语言前缀:如果是法语(fr)且当前用户不是管理员(未登录或is_staff为False),就直接重定向到英语版本。

在你的主应用下新建middleware.py文件,写入以下代码:

from django.http import HttpResponseRedirect
from django.utils.translation import get_language

class RestrictFrenchAccessMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        current_lang = get_language()
        # 判定条件:访问法语 + 非管理员用户
        if current_lang == 'fr' and (not request.user.is_authenticated or not request.user.is_staff):
            # 替换路径中的语言前缀,重定向到对应英语页面
            path = request.path
            new_path = path.replace('/fr/', '/en/', 1) if '/fr/' in path else '/en/'
            return HttpResponseRedirect(new_path)
        
        response = self.get_response(request)
        return response

然后在settings.py的MIDDLEWARE列表里注册这个中间件(注意要放在AuthenticationMiddleware之后,这样才能正确获取request.user):

MIDDLEWARE = [
    # ... 其他系统中间件
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    # 添加你的自定义中间件
    'your_app_name.middleware.RestrictFrenchAccessMiddleware',
    # ... 其他中间件
]

3. 控制模板中的语言切换链接

在前端模板里,根据用户身份动态显示语言选项——普通用户只看到英语,管理员能看到两个语言:

{% load i18n %}

<div class="language-switch">
    {% get_current_language as current_lang %}
    {% if user.is_staff %}
        <a href="/en/" {% if current_lang == 'en' %}class="active"{% endif %}>{% trans 'English' %}</a>
        <a href="/fr/" {% if current_lang == 'fr' %}class="active"{% endif %}>{% trans 'French' %}</a>
    {% else %}
        <a href="/en/" {% if current_lang == 'en' %}class="active"{% endif %}>{% trans 'English' %}</a>
    {% endif %}
</div>

这样普通用户既看不到法语切换入口,就算手动输入/fr/路径,也会被中间件强制重定向到英语版本。

4. 额外:管理员后台语言切换(可选)

Django admin默认支持语言切换功能,只要你的LANGUAGES配置正确,管理员登录后就能在后台界面右上角看到语言选择下拉框,无需额外配置。


这套方案完美避开了settings加载顺序的问题,同时精准实现了你的权限控制需求:普通用户只能访问英语版本,管理员可自由切换英法双语。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:12:41