gpt4 book ai didi

django - django 语言环境如何在 View 之间工作

转载 作者:行者123 更新时间:2023-12-01 11:04:35 24 4
gpt4 key购买 nike

我知道 django 首先从浏览器标题中选择网站的默认语言,然后如果它与设置中的可能选择匹配,则以该语言显示页面。

我想做的是在用户登录后更改和设置该语言。我已经为用户提供了默认设置的表格。登录后,从那些 defaultSettings 模型中选择默认语言。而我正在做的是:

d = DefaultSettings.objects.filter(user = request.user)
if len(d) > 0 and d[0].has_default_language:
from django.utils import translation
translation.activate(d[0].default_language)
request.LANGUAGE_CODE = translation.get_language()

我看到的是“错误”语言的页面。

这让我问 - 为什么?我没有自己编写该代码。我从下面的例子中得到它

由于所有这些示例都修改了 middleware 中的请求/响应 - 我真的必须这样做吗? Django 是否在请求之间重置语言并尝试在每次请求后再次“猜测”它?

为什么我的设置方式一次都行不通?

艾伦

第一次回复后更新(来自 Sindri Guðmundsson):

    if form.is_valid ( ):
if not redirect_to or '//' in redirect_to or ' ' in redirect_to:
redirect_to = settings.LOGIN_REDIRECT_URL
if not form.cleaned_data [ 'remember_me' ]:
request.session.set_expiry ( 0 )
from django.contrib.auth import login
login ( request, form.get_user ( ) )
if request.session.test_cookie_worked ( ):
request.session.delete_test_cookie ( )
set_lang_to_user_default_language(request)
response = HttpResponseRedirect ( redirect_to )
d = DefaultSettings.objects.filter(user = request.user)
if len(d) > 0 and d[0].has_default_language:
from django.utils import translation
translation.activate(d[0].default_language)
logger.debug(translation.get_language())
request.LANGUAGE_CODE = translation.get_language()
if hasattr(request, 'session'):
logger.debug('set django_language')
request.session['django_language'] = translation.get_language()
else:
logger.debug('set response cookie')
response.set_cookie(settings.LANGUAGE_COOKIE_NAME, translation.get_language())
return response

当我检查日志时,我看到:

DEBUG 2011-09-01 09:08:13,379 et
DEBUG 2011-09-01 09:08:13,379 set django_language

但是当我在下一个 View 中检查模板时,我打印了 {{ LANGUAGE_CODE }},然后它显示“en”而不是“et”

更新2:

实际上处理这个 View 后会发生什么:此 View 重定向到 {{ LANGUAGE_CODE }} 的第一个页面是“en”内容是英文的我在第一个 {{ LANGUAGE_CODE }} 之后进入的第二页是“en”,但内容是爱沙尼亚语我在第 2 个 {{ LANGUAGE_CODE }} 之后进入的第 3 页是“en”,内容再次是英文,并且从那以后仍然是英文。

看来我必须创建自己的中间件才能使页面保持“正确”的语言……不过我的问题是 - 为什么?

Update3:我的语言设置是这样的:

LANGUAGES = (
('et', gettext('Estonian')),
('en', gettext('English')),
('ru', gettext('Russian')),
('lv', gettext('Latvian')),
('lt', gettext('Lithuanian')),
('fi', gettext('Finnish')),
)

但经过进一步调查,我认为我找到了解决方法。我在这个项目中使用了 django-cms 并关闭了 cms.middleware.multilingual.MultilingualURLMiddleware 并遇到了我上面描述的问题。当我重新打开它时,一切正常 - 但它工作正常是因为 middleware 已打开并将所需参数放入每个响应中。

我最初提出的问题是 - 它是如何工作的。我后来问过为什么。现在,我认为,问题是 - 是否真的必须像 middleware 那样为每个 request/response 设置语言,并且像示例 middlewares 做什么?

最佳答案

建议/回答:

我也有一些奇怪的行为!因为我忘记添加“LocaleMiddleware”,请仔细检查它是否存在,为了说明,这是我的“MIDDLEWARE_CLASSES”的样子:

MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)

那个中间件负责处理你的请求和响应,并添加语言!

同时保留“Sindri Guðmundsson”的代码,它正在改变语言!

编辑

还有一点!如果我们看一下 LocaleMiddleware:

def process_request(self, request):
language = translation.get_language_from_request(request)
translation.activate(language)
request.LANGUAGE_CODE = translation.get_language()

那么问题来了!为什么 Django 需要那个?!答案:因为如果您使用 {{ LANGUAGE_CODE }} 它是从 REQUEST 读取的,所以 LANGUAGE_CODE 必须在请求中!否则 !它不会归还它!这就是这个中间件存在的原因!查看评论,在中间件的实际源代码中:

"""
This is a very simple middleware that parses a request
and decides what translation object to install in the current
thread context. This allows pages to be dynamically
translated to the language the user desires (if the language
is available, of course).
"""

同时查看文档:https://docs.djangoproject.com/en/1.3/topics/i18n/deployment/#how-django-discovers-language-preference

关于django - django 语言环境如何在 View 之间工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7257895/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com