Многоязычный слаг с django-translation-fields
Я пытаюсь реализовать многоязычный веб-сайт Django с помощью django-translation-fields.
Проект, над которым я работаю, основан на cookiecutter-django и Docker.
Перевод отлично работает для моих полей модели - кроме поданной слизни. На самом деле перевод пули тоже работает, но я не могу взять поле пули для получения одной записи.
Выдержка из модели голосования:
class Voting(models.Model):
slug = TranslatedField(
models.SlugField(
max_length=80,
unique=True,
verbose_name="Voting URL slug",
blank=True
),
{
"de": {"blank": True},
"fr": {"blank": True},
"it": {"blank": True},
"rm": {"blank": True},
"en": {"blank": True},
},
)
Полная модель голосования проекта можно посмотреть здесь.
Выдержка из зрения:
def voting(request, slug):
voting = get_object_or_404(Voting, slug=slug)
context = {
'voting': voting
}
return render(request, 'votes/single.html', context)
Полный вид можно увидеть здесь
Поскольку Django переведенные поля создает slug_en
, slug_de
и так далее, я не могу найти решение для получения пули на соответствующем языке.
Это должно быть очевидно, так как документация по Django-переведенным полям гласит:
Поле модели фактически не создается. Экземпляр TranslatedField является дескриптором, который по умолчанию действует как свойство для поля текущего языка.
К сожалению, не понимаю, все равно. Любая идея, как я могу изменить модель голосования для получения записи на определенном языке?
1 ответ
from translated_fields import to_attribute
def voting(request, slug):
voting = get_object_or_404(Voting, **{to_attribute(name='slug'): slug})
context = {
'voting': voting
}
return render(request, 'votes/single.html', context)
При необходимости можно добавить language_code=request.LANGUAGE_CODE
на звонок to_attribute
, но обычно в этом нет необходимости:
voting = get_object_or_404(Voting, **{to_attribute(name='slug', language_code=request.LANGUAGE_CODE): slug})
Не уверен, что это правильный путь, но с помощью документации Django " Как Django обнаруживает языковые предпочтения" я пришел к следующему решению.
Изменение вида голосования следующим образом:
def voting(request, slug):
'''Takes slug of single voting and returns that voting object in
corresponding language.
'''
if request.LANGUAGE_CODE == 'de':
voting = get_object_or_404(Voting, slug_de=slug)
elif request.LANGUAGE_CODE == 'fr':
voting = get_object_or_404(Voting, slug_fr=slug)
elif request.LANGUAGE_CODE == 'it':
voting = get_object_or_404(Voting, slug_it=slug)
elif request.LANGUAGE_CODE == 'rm':
voting = get_object_or_404(Voting, slug_rm=slug)
elif request.LANGUAGE_CODE == 'en':
voting = get_object_or_404(Voting, slug_en=slug)
context = {
'voting': voting
}
return render(request, 'votes/single.html', context)