【问题标题】:Django REST Framework: Using the Accept-Language header to set an instance's "locale"Django REST Framework:使用 Accept-Language 标头设置实例的“语言环境”
【发布时间】:2020-06-03 22:15:34
【问题描述】:

所以,我有一个具有以下属性的模型:

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 标头 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 中设置属性的最佳方法是什么?

注意我也相信get_serializer_context()可以返回请求对象?

我也觉得这可能足够强大:

data = request.POST.copy()

serializer = self.get_serializer(data=data.update({'locale': request.headers.get('Accept-Language', 'en')}))

但这是“好习惯”吗?

热烈欢迎大家提出意见!

【问题讨论】:

    标签: python django django-rest-framework request django-3.0


    【解决方案1】:

    如果没有“非常考虑locale,请尝试使用此方法保存请求中的任何数据。

    1. 首先您需要将 locale 字段设置为 read_only
    class MyModelSerializer(serializers.ModelSerializer):
        class Meta:
            model = MyModel
            fields = '__all__'
            read_only_fields = ('locale',)
    1. 覆盖 ModelViewset 或类似视图类的 perform_create(...) 方法
    class MyModelViewSet(viewsets.ModelViewSet):
        # other code
        def perform_create(self, serializer):
            serializer.save(locale=self.request.headers.get('Accept-Language', 'en-gb'))

    【讨论】:

      猜你喜欢
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 2014-07-13
      • 1970-01-01
      相关资源
      最近更新 更多