Как получить язык по умолчанию, если запрашиваемый перевод недоступен

Я использую django-hvad для перевода моделей, и не все модели будут иметь переводы. Я хочу, чтобы по умолчанию было en-us,

Если сделан запрос на конкретный язык, ответ должен быть на этом языке, если модель имеет этот доступный перевод. Если перевод недоступен, я хочу en-us быть возвращенным.

Прямо сейчас, что происходит, я получаю ошибку 500: 'HttpResponse' object has no attribute '_meta', Это происходит как тогда, когда перевод недоступен, так и когда код языка не определен в LANGUAGES,

Например, я получаю правильный ответ со статусом 200, когда я делаю запрос на en-us:

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

Если я сделаю запрос на en-US Я получаю ошибку 500 (обратите внимание на изменения в заглавных en-us в en-US):

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

Я получаю ту же ошибку 500 при запросе языка, определенного в LANGUAGES но не имеет перевода:

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')),
    ...
    ]

Если вам интересно, как обрабатывается этот запрос, вот представление для этого URL:

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 ответ

Нашел это решение по 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 должна помочь.

Другие вопросы по тегам