2017-11-21 12 views
0

ユーザープロファイルモデルで設定された言語に基づいて翻訳言語を設定するためのミックスインを作成しようとしています。 getリクエストが来たら、mixinは言語をユーザ言語に設定し、mixinを追加するビューから応答を得て、それまでの言語に戻します。私は呼び出された次のmixinを書きましたが、getメソッドは呼び出されません。私は間違って何をしていますか?あなたがsuper()を呼び出さない限り、あなたのミックスインのget()メソッドが呼び出されることはありませんあなたのSomeView上書きget()、もしDjangoクラスベースのビューでgetメソッドの動作を変更するためのMixin

class SetUserLanguageMixin(object): 
    def get(self, request): 
     current_language = translation.get_language() 
     try: 
      translation.activate(request.user.profile.language) 
      response = super(SetUserLanguageMixin, self).get(request) 
     finally: 
      translation.activate(current_language) 

     return response 

class SomeView(LoggingMixin, APIView, SetUserLanguageMixin): 
    def get(self, request): 
     ... 
     return Response(data, status=status.HTTP_200_OK) 

答えて

0

。代わりにmixinにdispatchを上書きすることができます。オーバーライドされたGET /発送方法は、引数とkwargsからを受け入れた場合、あなたのビューはより堅牢になります

注:私は、ビューでget_requestを言うミックスインのgetからget_requestを呼び出すために取得の名前を変更する場合、それは動作します

def dispatch(self, request, *args, **kwargs): 
    ... 
    response = super(SetUserLanguageMixin, self).dispatch(request, *args, **kwargs) 
    ... 
+0

。私はgetメソッドを "ラップする"必要があります(前と後のいくつかのアクションを行う)。この場合、ディスパッチを無効にすることがうまくいかないかどうかはわかりません。 – foobar

+0

['dispatch'](https://docs.djangoproject.com/en/1.11/ref/class-based-views/base/#django.views.generic.base.View.dispatch)をオーバーライドすると同じ効果が得られるはずです。 'response = super(SetUserLanguageMixin、self).get(request)'を呼び出すと、ディスパッチのデフォルトの実装は、 'HTTP'メソッドに基づいてメソッドを呼び出すことです。つまり、GETリクエストの場合は' get() 'です。 – Alasdair

+0

ありがとうございます。私はAPIViewの前に置くとすぐにディスパッチを呼び出すようです。 rest_framework.views.APIViewにもディスパッチメソッドがあるため、競合が発生しています。 – foobar

関連する問題