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

