Многоязычный слаг с 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)
Другие вопросы по тегам