Django REST Framework:使用 Accept-Language header 设置实例的 "locale"
Django REST Framework: Using the Accept-Language header to set an instance's "locale"
所以,我有一个具有以下属性的模型:
locale = models.CharField(max_length=10, choices=get_locale_choices(), default='en-gb')
此模型的关联序列化程序当前为:
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = '__all__'
然后我调用创建端点:
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
我想知道,如何最好地修改以上内容以允许 MyModel 的 locale 属性由 Accept-Language header en-GB,en;q=0.5
.
更新
我从 django.conf.locale.LANG_INFO:
中获取语言环境选项
from django.conf.locale import LANG_INFO
def get_locale_choices():
return [(k, v['name']) for k, v in LANG_INFO.items() if 'name' in v]
我想我需要传入 request.headers 作为某种额外的上下文...?但是我在想,如果 Accept-Language 没有设置怎么办等等?我知道它在这里:
request.headers['Accept-Language']
所以,我想 request.headers.get('Accept-Language', 'en-gb')
是可以接受的...
但是,然后将 serialzier 中的属性设置为这样的最佳方法是什么?
N.B。我也相信 get_serializer_context()
可以 return 请求 object?
我也觉得这可能足够稳健:
data = request.POST.copy()
serializer = self.get_serializer(data=data.update({'locale': request.headers.get('Accept-Language', 'en')}))
但这是,"good practise"?
热烈欢迎提出意见!
没有"much considering the locale
"试试这个方法来保存来自请求的任何数据。
- 首先你需要将
locale
字段设置为read_only
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = '__all__'
<b>read_only_fields = ('locale',)</b>
- 覆盖 ModelViewset 或类似视图类的
perform_create(...)
方法
class MyModelViewSet(viewsets.ModelViewSet):
# other code
<b>def perform_create(self, serializer):
serializer.save(locale=self.request.headers.get('Accept-Language', 'en-gb'))</b>
所以,我有一个具有以下属性的模型:
locale = models.CharField(max_length=10, choices=get_locale_choices(), default='en-gb')
此模型的关联序列化程序当前为:
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = '__all__'
然后我调用创建端点:
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
我想知道,如何最好地修改以上内容以允许 MyModel 的 locale 属性由 Accept-Language header en-GB,en;q=0.5
.
我从 django.conf.locale.LANG_INFO:
中获取语言环境选项from django.conf.locale import LANG_INFO
def get_locale_choices():
return [(k, v['name']) for k, v in LANG_INFO.items() if 'name' in v]
我想我需要传入 request.headers 作为某种额外的上下文...?但是我在想,如果 Accept-Language 没有设置怎么办等等?我知道它在这里:
request.headers['Accept-Language']
所以,我想 request.headers.get('Accept-Language', 'en-gb')
是可以接受的...
但是,然后将 serialzier 中的属性设置为这样的最佳方法是什么?
N.B。我也相信 get_serializer_context()
可以 return 请求 object?
我也觉得这可能足够稳健:
data = request.POST.copy()
serializer = self.get_serializer(data=data.update({'locale': request.headers.get('Accept-Language', 'en')}))
但这是,"good practise"?
热烈欢迎提出意见!
没有"much considering the locale
"试试这个方法来保存来自请求的任何数据。
- 首先你需要将
locale
字段设置为read_only
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = '__all__'
<b>read_only_fields = ('locale',)</b>
- 覆盖 ModelViewset 或类似视图类的
perform_create(...)
方法
class MyModelViewSet(viewsets.ModelViewSet):
# other code
<b>def perform_create(self, serializer):
serializer.save(locale=self.request.headers.get('Accept-Language', 'en-gb'))</b>