Mixin 用于在基于 Django class 的视图中更改 get 方法的行为
Mixin for changing the behaviour of a get method in Django class based view
我正在尝试编写一个 mixin,用于根据用户配置文件模型中设置的语言设置翻译语言。
当收到请求时,mixin 应该将语言设置为用户语言,从添加 mixin 的视图中获取响应,然后将语言设置回之前的状态。我写了下面的 mixin,它被调用了,但是它的 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)
如果您的 SomeView
覆盖了 get()
,那么您的 mixin 的 get()
方法将不会被调用,除非您调用 super()
。您可以尝试在混入中覆盖 dispatch
。
请注意,如果覆盖的 get/dispatch 方法接受 args 和 kwargs,您的视图将更加健壮:
def dispatch(self, request, *args, **kwargs):
...
response = super(SetUserLanguageMixin, self).dispatch(request, *args, **kwargs)
...
我正在尝试编写一个 mixin,用于根据用户配置文件模型中设置的语言设置翻译语言。 当收到请求时,mixin 应该将语言设置为用户语言,从添加 mixin 的视图中获取响应,然后将语言设置回之前的状态。我写了下面的 mixin,它被调用了,但是它的 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)
如果您的 SomeView
覆盖了 get()
,那么您的 mixin 的 get()
方法将不会被调用,除非您调用 super()
。您可以尝试在混入中覆盖 dispatch
。
请注意,如果覆盖的 get/dispatch 方法接受 args 和 kwargs,您的视图将更加健壮:
def dispatch(self, request, *args, **kwargs):
...
response = super(SetUserLanguageMixin, self).dispatch(request, *args, **kwargs)
...