微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

登录Django后如何设置整个会话的语言

如何解决登录Django后如何设置整个会话的语言

我被卡住了,试图为整个会话设置语言,以便根据登录时输入的语言显示菜单、表单等。

为此,我定义了以下内容

在 settings.py 文件添加中间件:

'django.middleware.locale.LocaleMiddleware',

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.locale.LocaleMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',]

还要添加上下文渲染器: 'django.template.context_processors.i18n'

我定义了我的 3 种语言:

LANGUAGE_CODE = 'es'

LANGUAGES = [
    ('es' _('Spanish')),('en',_ ('English')),('it',_ ('Italian')),] 

这是我的观点:

class LoginFormView(FormView):
    form_class = UserLoginForm
    template_name = 'login.html'
    success_url = reverse_lazy('index')

    def dispatch(self,request,*args,**kwargs):
        if request.user.is_authenticated:
            return HttpResponseRedirect(self.success_url)
        return super().dispatch(request,**kwargs)

    def form_valid(self,form):
        login(self.request,form.get_user())
        user_language = self.request.POST.get('language',None)
        translation.activate(user_language)
        self.request.session['django_language'] = user_language
        self.request.session[translation.LANGUAGE_SESSION_KEY] = user_language
        return HttpResponseRedirect(self.success_url)

    def get_context_data(self,**kwargs):
        context = super().get_context_data(**kwargs)
        context['title'] = 'Iniciar sesión'
        return context

尽管如此,登录后的语言不会改变,始终保持为西班牙语。

所有模板都有标签

{% load i18n %}

我还尝试通过在导航栏中放置一个按钮来强制更改语言,以测试翻译是否有效并且确实运行良好

<button type="button" class="btn-shadow p-1 btn btn-primary btn-sm">
  {% include 'change_language.html' %}
  <i class="fa text-white fa-calendar pr-1 pl-1"></i>
</button>

change_language.html

 {% load i18n %}
    <form action="/i18n/setlang/" method="post" style="display: inline;">
    {% csrf_token %}
      <div style="display: inline;">
        <select name="language" onchange="javascript:form.submit()">
          {% for lang in LANGUAGES %}
            <option value="{{ lang.0 }}"{% ifequal LANGUAGE_CODE lang.0 %} selected="selected"{% endifequal %}>{{ lang.1 }}</option>
          {% endfor %}
        </select>
      </div>
    </form>

因此,我不知道我放在 form_valid() 中的代码是否正确以及是否应该放在那里。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。