2

モデルの翻訳に 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

をリクエストすると、500 エラーが発生します (大文字が からにen-US変更されていることに注意してください)。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ファイルの言語セクションは次のとおりです。

設定.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 のビューを次に示します。

ビュー.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)
4

1 に答える 1

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)

クエリが評価されるときに現在の言語に解決されるものはありません。並べ替えは行われませんが、クエリの仕組みにより、同じ言語が 2 回表示されても問題ありません。また、デフォルトのクエリセット (language、untranslated などのいずれも呼び出されない場合に使用) を同じ方法でオーバーライドできるようになりました。たとえば、default_class=MyFallbackQueryset を渡すだけでうまくいくはずです。

于 2017-03-15T21:35:21.470 に答える