2010-04-29 4 views
3

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

from django.contrib.auth import logout 

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

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

ответ

1

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

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

0

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

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

+0

Я не совсем уверен, что это будет работать, когда пользователь регистрируется _out_ но Defintely, когда они вошли _in_ – NeonNinja

+0

Профиль пользователя не поможет после того, как пользователи вышли из. – jack

2

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

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

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

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

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

# 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

Это сработало для меня, спасибо. Вы забыли поставить 'language = None' перед' if hasattr (..) '. В противном случае он может выйти из строя. – Menda

+0

@Menda спасибо за уведомление! Починил это. –