2017-11-21 4 views
0

사용자 프로필 모델에 설정된 언어를 기반으로 번역 언어를 설정하기위한 믹스 인을 작성하려고합니다. get 요청이 들어 오면 mixin은 언어를 사용자 언어로 설정하고 믹스 인을 추가하는보기에서 응답을받은 다음 이전의 언어로 다시 설정해야합니다. 나는 다음과 같은 mixin을 작성했다. 이것은 호출되지만 get 메소드는 호출되지 않는다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 당신이 super()를 호출하지 않는 한 다음 믹스 인의 get() 메서드가 호출되지 않을 것이다 SomeView 우선 get(), 만약Django 클래스 기반 뷰에서 get 메소드의 동작을 변경하기위한 믹스

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

. 대신 믹스 인에서 dispatch을 무시할 수 있습니다. 재정의 된 GET/발송 방법은 인수와 kwargs로를 받아들이는 경우보기보다 강력한 될 것입니다

참고 : 다음 뷰에서 get_request 말을 믹스 인의 GET에서 get_request를 호출하는 GET의 이름을 바꿀 경우 작동

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)'를 호출 할 때, dispatch의 기본 구현은 GET 요청에 대해'get' 메소드 즉'get()'에 기반하여 메소드를 호출하는 것입니다. – Alasdair

+0

예제를 제공해 주셔서 감사합니다. APIView 전에 배치하면 디스패치를 ​​호출하는 것 같습니다. rest_framework.views.APIView에는 디스패치 메소드도 있으므로 충돌이 발생합니다. – foobar