如果请求的翻译不可用,如何获取默认语言

时间:2016-03-17 18:25:01

标签: python django internationalization django-hvad

我正在使用django-hvad进行模型翻译,并非所有模型都有翻译。我希望默认值为en-us

如果针对特定语言发出请求,则如果模型具有该翻译,则响应应采用该语言。如果翻译不可用,我希望返回en-us

现在发生的事情是我收到错误500:'HttpResponse' object has no attribute '_meta'。当翻译不可用以及未在LANGUAGES中定义语言代码时,会发生这种情况。

例如,当我发出en-us请求时,我收到状态为200的正确回复:

GET http://localhost:5000/survey/surveys/2/?language=en-us

如果我提出en-US请求,则会收到500错误(请注意从en-usen-US的上限更改):

GET http://localhost:5000/survey/surveys/2/?language=en-US

我在请求LANGUAGES中定义但没有翻译的语言时遇到相同的500错误:

GET http://localhost:5000/survey/surveys/2/?language=af

这是我的settings.py文件的语言部分:

settings.py

from django.utils.translation import ugettext_lazy as _

...
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True

LANGUAGES = [
    ('en-us', _('English')),
    ('af', _('Afrikaans')),
    ('ar', _('Arabic')),
    ...
    ]

如果您想知道如何提供此请求,请点击该网址的视图:

views.py

class SurveyDetail(APIView):
    def get_object(self, pk):
        try:
            user_language = self.request.GET.get('language')
            return models.Survey.objects.language(user_language).get(pk=pk)
        except models.Survey.DoesNotExist:
            return HttpResponse(status=status.HTTP_404_NOT_FOUND)

    def get_related_questions(self, pk):
        try:
            user_language = self.request.GET.get('language')
            return models.SurveyQuestion.objects.language(user_language).all().filter(survey=pk)
        except models.SurveyAnswer.DoesNotExist:
            return HttpResponse(status=status.HTTP_404_NOT_FOUND)

    def get_related_answers(self, pk):
        try:
            user_language = self.request.GET.get('language')
            return models.SurveyAnswer.objects.language(user_language).all().filter(question=pk)
        except models.SurveyAnswer.DoesNotExist:
            return HttpResponse(status=status.HTTP_404_NOT_FOUND)

    def get(self, request, pk, format=None):
        survey = self.get_object(pk)
        questions = self.get_related_questions(pk)
        questions_serialized = []
        for q in questions:
            questions_serialized.append(SurveyQuestionSerializer(q).data)
            questions_serialized[-1]['answers']  = SurveyAnswerSerializer(self.get_related_answers(q.pk), many=True).data

        resp_obj = SurveySerializer(survey).data
        resp_obj['questions'] = questions_serialized

        return JSONResponse(resp_obj)

1 个答案:

答案 0 :(得分:0)

https://github.com/spectras

找到此解决方案

https://github.com/KristianOellegaard/django-hvad/issues/136

class MyFallbackQueryset(FallbackQueryset):
    translation_fallbacks = (None, 'en', 'de', 'fr')  

class MyModel(TranslatableModel):
    objects = TranslationManager(fallback_class=MyFallbackQueryset)

在评估查询时,将无解析为当前语言。不会重新排序,但由于查询的工作方式,使用相同的语言出现两次并不重要。 此外,现在可以以相同的方式覆盖默认查询集(在没有语言,未翻译,...时使用)。例如,只需传递default_class = MyFallbackQueryset即可。