Функция выхода из Django удаляет настройки локали - PullRequest
3 голосов
/ 29 апреля 2010

Когда я использую функцию выхода из Django для выхода из аутентифицированного пользователя, он переключает языковой стандарт на en_US, по умолчанию.

from django.contrib.auth import logout

def someview(request):
    logout(request)
    return HttpResponseRedirect('/')

Как сохранить локаль пользователя после выхода из системы?

Ответы [ 3 ]

2 голосов
/ 28 января 2012

Я решил проблему, поместив django.contrib.auth.views.logout в пользовательское представление и сбросив язык сеанса после выхода из системы. Там какой-то код.

У меня есть приложение с именем login со следующим urls.py:

# myproject/login/urls.py
from django.conf.urls.defaults import patterns

urlpatterns = patterns('myproject.login.views',
    ...
    (r'^logout/$', 'logoutAction'),
    ...
)

Так что теперь URL / logout / вызывает представление с именем logoutAction в views.py. В logoutAction старый код языка временно сохраняется и вставляется обратно в сеанс после вызова contrib.auth.views.logout Джанго.

# myproject/login/views.py
...
from django.contrib.auth.views import logout as auth_logout

def logoutAction(request):
    # Django auth logout erases all session data, including the user's
    # current language. So from the user's point of view, the change is
    # somewhat odd when he/she arrives to next page. Lets try to fix this.

    # Store the session language temporarily if the language data exists.
    # Its possible that it doesn't, for example if session middleware is
    # not used. Define language variable and reset to None so it can be
    # tested later even if session has not django_language.
    language = None
    if hasattr(request, 'session'):
        if 'django_language' in request.session:
            language = request.session['django_language']

    # Do logout. This erases session data, including the locale language and
    # returns HttpResponseRedirect to the login page. In this case the login
    # page is located at '/'
    response = auth_logout(request, next_page='/')

    # Preserve the session language by setting it again. The language might
    # be None and if so, do nothing special.
    if language:
        request.session['django_language'] = language

    # Now user is happy.
    return response

Конец проблемы LAN Quake:)

1 голос
/ 29 апреля 2010

Вы можете попытаться явно установить языковой cookie, когда пользователь выходит из системы, здесь немного о том, как django определяет настройку языка здесь в djangodocs .

Я бы предположил, что языковой параметр остался бы в качестве значения сеанса при выходе из системы, возможно, его необходимо повторно инициализировать, если django полностью уничтожит сеанс при выходе пользователя из системы.

0 голосов
/ 29 апреля 2010

Вы можете создать модель UserProfile (которая имеет уникальный внешний ключ для пользователя) и сохранить там языковые предпочтения пользователя (и любые другие дополнительные пользовательские настройки).Затем при каждом входе в систему для пользователя можно установить языковой код, сохраненный в профиле пользователя.

В Django есть настройка AUTH_PROFILE_MODULE, где вы можете установить модель в качестве "официальной" модели профиля пользователя для django.contrib.auth

...