2017-07-14 9 views
1

私は、Python 3.6とDjango 1.11を使用していた後に、ユーザが格納されている言語を活性化させます。私はDjangoのクラスベースの認証ビューとカスタムユーザモデルを使用しています。私のユーザーはデータベースに言語を保存しています。私は毎回ログインした後でこの言語を取得し、それを有効にしたいと思います。Djangoは:ログイン

私はuser_logged_in信号を介してこれを行うには期待していたが、信号がどのような方法での応答に影響を与えることができないので、これは不可能です。

もう一つの方法は、私は避けたかったものですデフォルト認証ビューをオーバーライドすることです。

他の方法はありますか?ありがとうございました。最後に

+0

あなたはまだ 'translation.activate(usr_lan)' –

+0

感謝を介して信号におけるユーザーの言語を変更することができます。はい、私は 'activate'を使うことができますが、要求にはi18nパス( '/ en/route/...'など)があります。 'LocaleMiddleware'はURLから言語を優先させるので、問題は解決しません。私はリダイレクトすることができなければならないでしょう、そして、あなたはシグナルからすることはできません。 – petr

+0

さて、いかが 'カスタムとLocaleMiddleware'' CustomLocaleMiddleware'を拡張し、 'process_request'は何とかlangの取得および設定? –

答えて

2

は、私は、最小限の認証ビューのオーバーライドと一緒に行きました。ミドルウェアはすべての要求にいくつかのオーバーヘッドを追加しますが、これはログイン中にのみ実行されるため、カスタム言語のミドルウェアよりも優れています。ユーザーがログインした後、それが呼び出されているので、私はget_success_urlメソッドをオーバーライドしている(私が必要とする)と、それが潜在的に将来的にセキュリティホールを導入する可能性があるため、私は、ログイン/認証プロセス自体に干渉したくありませんでした。

from django.conf import settings 
from django.contrib.auth.views import LoginView 
from django.urls import translate_url 
from django.utils.translation import activate, LANGUAGE_SESSION_KEY 

# available languages should be obtained from settings.LANGUAGES 
available_languages = [lang_code for (lang_code, lang_name) in settings.LANGUAGES] 

class CustomLoginView(LoginView): 
    def get_success_url(self): 
     url = super(CustomLoginView, self).get_success_url() 
     user = self.request.user 
     if user.is_authenticated(): 
      language = user.get_setting('language') 

      if language in available_languages: 
       url = translate_url(url, language) 
       activate(language) 
       if hasattr(self.request, 'session'): 
        self.request.session[LANGUAGE_SESSION_KEY] = language 

     return url 
関連する問題