我正在使用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错误(注意caps从en-us更改为en-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')),
...
]如果您想知道这个请求是如何处理的,下面是该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)发布于 2017-03-16 05:35:21
从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就可以了。
https://stackoverflow.com/questions/36068792
复制相似问题